Appearance
41.缺失的第一个正数
题目描述
给你一个未排序的整数数组 nums
,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n)
并且只使用常数级别额外空间的解决方案。
AC 代码
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for(int i = 0; i < n; i++){
// 因为数组是从[0,n]的范围,基本符合题目中要求的最小正整数,从1开始
// 我们可以将符合这个区间的元素放到正确的位置,比如nums[3] = 6 那么应该和nums[5]进行交换
while(nums[i] > 0 && nums[i] < n && nums[nums[i] - 1] != nums[i]){
int tmp = nums[nums[i] -1];
nums[nums[i] -1] = nums[i];
nums[i] = tmp;
// 交换后这个值也满足条件,继续交换
// 不满足条件,要不就是>n,要不就是<0,要不就是两者相等,都可以跳过
}
}
for(int i = 0; i < n; i++){
// 只要不满足nums[i] == i + 1,要不就是>n,要不就是<0,要不就是两者相等,直接返回结果
if(nums[i] != i + 1)
return i + 1;
}
// 说明1到n都存在,最小就是n+1
return n + 1;
}
}
总结
如果你还有更多的思考、分析、总结,通通都加上来吧~