41. 缺失的第一个正数
题目链接
排序后寻找
- 先排序,再看每个位置的数是否符合
- 第一个不符合的位置,就是缺失的第一个正数
class Solution {
public int firstMissingPositive(int[] nums) {
Arrays.sort(nums);
int ans = 1;
for(int x : nums){
if(x > ans)
break;
if(x == ans)
ans++;
}
return ans;
}
}
原地归位后寻找
- 题目要求时间复杂度O(n),那么就不能排序,必然要使用索引直接把正数放到对应的位置
- 但是要求常数级别的额外空间,那么只能在原地交换
- 原数组是0len-1,我们需要在里面存储正整数1len,所以正确的位置应该是nums[i] = i + 1
- 所以我们扫描数组,把位置不正确的数交换到正确的位置,最后再按照相同的方式扫描即可
- 过程中需要注意一点:
- 交换的时候,要先改变nums[nums[i] - 1],否则nums[i]改变后,nums[nums[i] - 1]就找不到了
class Solution {
public int firstMissingPositive(int[] nums) {
int len = nums.length;
for(int i = 0; i < len; i++){
while(nums[i] > 0 && nums[i] <= len && nums[nums[i] - 1] != nums[i]){
int temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
}
}
for(int i = 0; i < len; i++)
if(nums[i] - 1 != i)
return i + 1;
return len + 1;
}
}