41. 缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
说明:
- 你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
这题确实挺坑的,首先对数组排个序,当时想用数组标记的,没想到还有INT_MAX级别的数,不过vector应该是装的下的,但从1标记到INT_MAX好像也不太理想,后来想了下,可以用枚举连续数字与nums做比较,不相等的不就是缺少的嘛,结果里面还有重复元素,所以还需要考虑去重,整了好长时间-_-
static const auto __ = []() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
sort(nums.begin(),nums.end());
if(nums.size()==0 || nums.front()>1||nums.back()<=0) return 1;
int k=0;
while(nums[k]<=0) k++;
int ans =1;
int i=1;
for(i=1;i<=nums.back();i++)
{
while(nums[k]==nums[k-1]) k++; //去重
if(nums[k] == i)
{
k++;
}
else
{
ans = i;
break; //别忘了break
}
}
if(i>nums.back())
ans = i;
return ans;
}
};