您的位置:首页 > 编程语言 > C语言/C++

41. First Missing Positive

2016-09-30 14:25 232 查看


题目要求要用O(N)的时间复杂度,使用常数空间

开始我是先用排序做的,想不出O(N)时间复杂度的算法

class Solution {
public:
int firstMissingPositive(vector<int>& nums)
{
if(nums.empty())
return 1;
sort(nums.begin(),nums.end());
int i=0,j,temp;
while(nums[i]<0&&i<nums.size())
i++;
if(nums[i]!=0)
nums.insert(nums.begin()+i,0);
for(j=i;j<nums.size();j++)
{
while(j+1<nums.size()&&nums[j]==nums[j+1])
j++;
if(j+1<nums.size()&&(nums[j]+1)!=nums[j+1])
{
temp=nums[j]+1;
break;
}
}
if(j==nums.size())
temp=nums[j-1]+1;
return temp;
}
};


看了别人的程序才明白,这道题类似桶排序

首先扫描一遍数组,如果某个元素在1~nums.size()之间,则把它放入原数组中的i-1位置。最后扫描原数组一遍,找到第一个满足A[i] != i+1的数。

class Solution {
public:
int firstMissingPositive(vector<int>& nums)
{
if(nums.empty())
return 1;
int i=0;
while(i<nums.size())
{
if(nums[i]!=i+1&&nums[i]>0&&nums[i]<=nums.size()&&nums[i]!=nums[nums[i]-1])//当nums[i]!=i+1不满足时一直交换,最后一个条件是防止陷入死循环
{
int temp=nums[i];
nums[i]=nums[nums[i]-1];
nums[temp-1]=temp;
}
else
i++;
}
for(i=0;i<nums.size();i++)
{
if(nums[i]!=i+1)
return i+1;
}
return nums.size()+1;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C-C++