题目
41.缺失的第一个正数 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0] 输出:3 示例 2:
输入:nums = [3,4,-1,1] 输出:2
方法一:自创哈希法,三个循环三步走
关键语句,标记: nums[num-1] = -Math.abs(nums[num-1]);
理解的不是很透彻,之后再来补充。
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
//第一步,让数组中所有负数为n+1。因为负数可以直接排除在外,数组中没有出现过的最小正整数,只可能出现在[1,n]范围里。
for(int i = 0; i < n; ++i)
{
if(nums[i] <= 0)
{
//n为数组的长度,也是最大的可能结果,如果数组中全为负数或0时,则答案为n,所以可以把负数设为n+1,即不可能是结果的数
nums[i] = n + 1;
}
}
//第二步,标记所有出现过比n小的数x,标记的实际上是x-1
for(int i = 0; i < n; ++i)
{
int num = Math.abs(nums[i]);
if(num <= n)
{
nums[num-1] = -Math.abs(nums[num-1]);//用负号标记nums[num-1]
}
}
//第三步,再次遍历数组,此时,若遍历到第一个位置i为正整数,则i+1为没有出现过的最小的正整数。
for(int i = 0; i < n; ++i)
{
if(nums[i] > 0)
return i + 1;
}
return n + 1;
}
}