题意
找出一个序列第一个缺失的正整数,时间复杂度要求O(n),不能开辟新的内存
思路
因为不能开辟内存,所以只能从原有数组下手,题目规定了要找的数为正整数,所以说可以使用原有数组建hash表,将正整数映射在数组中,但是序列的最大值可能为序列的长度,所以说映射过程中要把正整数i映射在
需要注意的case:
- 缺失的数在末尾且不含负数和0的时候,需要判断
代码
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
size_t len = nums.size();
if(len == 0) return 1;
for(int i = 0; i < len; i++){
if(nums[i] <= 0) continue;
while(nums[i] <= len && nums[nums[i] - 1] != nums[i]){
swap(nums[nums[i] - 1], nums[i]);
}
}
int ans = -1;
for(int i = 0; i < len; i++){
if(nums[i] != i + 1){
ans = i + 1;
break;
}
}
if(ans == -1) ans = len + 1;
return ans;
}
};