41. First Missing Positive
Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0]
return 3
,
and [3,4,-1,1]
return 2
.
Your algorithm should run in O(n) time and uses constant space.
本题开始没认真审题,后来发现要求在给定的空间里面做题。因此不能用missing number里面的创建数组来做;
看了discussion的讨论,发现很巧妙。首先,把数组分成两部分,把值大于0的数放在数组的前面,假设有k个大于0的值。然后在那些值大于0的部分遍历,如果值还小于等于k,那么就把那个索引的数组标记为负数,依次遍历,代码如下:
public class Solution {
public int firstMissingPositive(int[] nums) {
int len = nums.length;
if(len==0) return 1;
int k =part(nums);
for(int i=0;i<k;i++){
int temp = Math.abs(nums[i]);
if(temp<=k) nums[temp-1] = nums[temp-1]>0?-nums[temp-1]:nums[temp-1];
}
int res = k+1;
for(int i=0;i<k;i++){
if(nums[i]>0){
res = i+1;
break;
}
}
return res;
}
public int part(int[] nums){
int q = 0;
for(int i=0;i<nums.length;i++){
if(nums[i]>0){
swap(nums,q++,i);
}
}
return q;
}
public void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
这道题可以用来解决所有不连续出现的值,是否连续的问题,但是,missing number是不可以这么解决的,因为包括了0,而0没有负数。这道题的隐身含义是,相当于创建了一个boolean类型的数组。