【力扣hot100题】(016)缺失的第一个正数
题目里这么多条条框框……先不按条条框框做了两下。
第一个思路:你不仁我不义,先排序后遍历(时间不符题意)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
sort(nums.begin(),nums.end());
if(nums[0]>1) return 1;
if(nums[nums.size()-1]<=0) return 1;
for(int i=1;i<nums.size();i++){
if(nums[i]>1&&nums[i-1]<=0) return 1;
if(nums[i-1]>=0&&nums[i]-nums[i-1]>1) return nums[i-1]+1;
}
return nums[nums.size()-1]+1;
}
};
排个序时间复杂度就o(nlogn)了,肯定不符题意,但还是过了。
看了一下之前的代码就是这个思路,而且比这个代码长了不少,看了我还是有进步(点头)
第二个思路:哈希表(空间不符题意)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
unordered_set<int> st;
int result=1;
for(int i=0;i<nums.size();i++) if(nums[i]>0) st.insert(nums[i]);
for(result;result<st.size()+1;result++) if(st.find(result)==st.end()) return result;
return result;
}
};
同样是很简单的思路,如果这题没有限制条件那么就是道简单题了。
第三个思路:答案思路,原地哈希表
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
while(nums[i]!=i+1&&nums[i]>0&&nums[i]<nums.size()&&nums[nums[i]-1]!=nums[i]){
swap(nums[i],nums[nums[i]-1]);
}
}
for(int i=0;i<nums.size();i++) if(nums[i]!=i+1) return i+1;
return nums.size()+1;
}
};
相当于把第二个思路优化了一下,不额外建立哈希表,而是将原数组当作哈希表,第i个位置存放的是数i+1,不过这个代码时间复杂度是o(n)确实震惊到我了。
感觉比较考验思维。