Description:
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.
分析:如果是个一部分完整的正数数组的话,那么array[i] = i + 1, 当不符合这一条件的时候就开始丢失了数字。所以我们将所有遇到的(符合条件的)数字放到他们的位置上,然后再去遍历一次,找到开始不符合的数字。在解答这道题的时候,在discuss中还发现了一个需要mark的点,那就是在对数组处理的时候我们对位置为i的元素处理之后(比如交换或者删除之后),需要对新的array[i]进行处理,以前一直用i--,现在发现用while显得更加concise。
代码:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int len = nums.size();
for(int i = 0; i < len; i++)
if(nums[i] <= len && nums[i] > 0 && nums[nums[i] - 1] != nums[i])
{
swap(nums[i], nums[nums[i] - 1]);
i--;
}
for(int i = 0; i < len; i++)
if(nums[i] != i + 1)
return i + 1;
return len + 1;
}
};
其中可以将
if(nums[i] <= len && nums[i] > 0 && nums[nums[i] - 1] != nums[i])
{
swap(nums[i], nums[nums[i] - 1]);
i--;
}
改成
while(nums[i] <= len && nums[i] > 0 && nums[nums[i] - 1] != nums[i])
{
swap(nums[i], nums[nums[i] - 1]);
}
【你必须非常努力 才能看起来毫不费力】