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; } };
相关文章推荐
- LeetCode(41)First Missing Positive
- 41. First Missing Positive
- 【leetcode】Array——First Missing Positive(41)
- LeetCode 41 First Missing Positive (思维)
- 41. First Missing Positive
- [*leetcode 41] First Missing Positive
- 41. First Missing Positive
- [leetcode 41] First Missing Positive
- 41. First Missing Positive
- LeetCode(41)First Missing Positive
- [Leetcode]_41 First Missing Positive
- leetcode 41 First Missing Positive
- 41. First Missing Positive
- 41. First Missing Positive
- 41. First Missing Positive
- leecode刷题 之 41 FirstMissingPositive
- 41. First Missing Positive
- 41. First Missing Positive
- leetcode || 41、First Missing Positive 问题
- 41. First Missing Positive