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.
思路一:首先将符合条件的正数和其他数分开,然后在正数中进行判断。假设符合条件的数的个数为N,假设nums[i]为temp,将nums[temp]的值设为对应的负数,说明temp这个数存在,最后再进行遍历判断丢失了那个正数。
代码如下:
class Solution {
public:
void swap(vector<int>& nums,int i,int j)
{
if(i!=j)
{
nums[i] ^= nums[j];
nums[j] ^= nums[i];
nums[i] ^= nums[j];
}
}
int partition(vector<int>& nums)
{
int i,q=-1;
i=0;
for(i=0;i<nums.size();i++)
{
if(nums[i]>0)
{
q++;
swap(nums,q,i);
}
}
return q;
}
int firstMissingPositive(vector<int>& nums) {
if(nums.empty())
return 1;
int k = partition(nums)+1;
for(int i=0;i<k;i++)
{
int temp = abs(nums[i]);
if(temp<=k)
nums[temp-1] = nums[temp-1]>0?-nums[temp-1]:nums[temp-1];
}
for(int i=0;i<k;i++)
{
if(nums[i] > 0)
return i+1;
}
return k+1;
}
};
思路二:将数值放到其对的下标处,然后判断哪个下标的对应的数值不是下标值加1,那么该下标值加1就是所求答案
代码如下:
class Solution {
public:
void swap(vector<int>& nums,int i,int j)
{
if(i!=j)
{
nums[i] ^= nums[j];
nums[j] ^= nums[i];
nums[i] ^= nums[j];
}
}
int firstMissingPositive(vector<int>& nums) {
for(int i=0;i<nums.size();i++)
{
if(nums[i] == i+1) continue;
int x = nums[i];
while(x >= 1 && x <= nums.size() && nums[x-1] != x)
{
swap(nums,i,x-1);
x=nums[i];
}
}
for(int i=0;i<nums.size();i++)
{
if(nums[i] != i+1)
return i+1;
}
return nums.size()+1;
}
};
效率依然不理想 - -