给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
示例 3:
输入:nums = [7,8,9,11,12]
输出:1
提示:
1 <= nums.length <= 5 * 105
-231 <= nums[i] <= 231 - 1
通过次数186,674提交次数443,730
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/first-missing-positive
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本题,复盘,再次没做出来,本题需要找到没有出现的第一个正数,使用标记法,将数组中的小于等于0,大于 n 的数字都等于 n + 1,然后再次遍历,如果在 1 - n 的范围,让该下标所在数组的位置标记为负数,这样从 0 开始遍历的时候,如果遇到正数,说明是不符合的,直接返回 i + 1,如果循环结束,说明第一个正数是数组的长度 + 1
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for (int i = 0; i < n; i++) {
if (nums[i] <= 0 || nums[i] > n) {
nums[i] = n + 1;
}
}
for (int i = 0; i < n; i++) {
int temp = Math.abs(nums[i]);
if (temp > 0 && temp <= n) {
nums[temp - 1] = -Math.abs(nums[temp - 1]);
}
}
for (int i = 0; i < n; i++) {
if (nums[i] > 0) {
return i + 1;
}
}
return n + 1;
}
}