题目:
解答:
这个涉及到一个排序算法,基数排序,在有序空间内,排序复杂度为 O ( m ) \Omicron(m) O(m) , m不是数列的个数,而是数列的值的范围。
方式是空间换时间,遍历数列,将每个数拍到自己在数组的正确序号位置上。
本题也是类似解法,处理方式是首先将数值为小雨等于零或者大于len的值置为-1,然后基数排序处理其余数,最后即可找出排序中缺失的数,如果没有,则为len + 1;
代码:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int len = nums.size();
for(int i = 0;i < len; ++i)
if(nums[i] <= 0 || nums[i] > len)
nums[i] = -1;
for(int i = 0;i < len; ++i){
if(nums[i] == -1 || nums[i] == i + 1) continue;
int num = nums[i];
nums[i] = -1;
while(num != -1 && nums[num-1] != num){
int tmp = nums[num-1];
nums[num-1] = num;
num = tmp;
}
}
for(int i = 0;i < len; ++i)
if(nums[i] < 0) return i + 1;
return len + 1;
}
};
更新会同步在我的网站更新(https://zergzerg.cn/notes/webnotes/leetcode/index.html)