21.03.11 LeetCode41. 缺失的第一个正数

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

 

进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗?

 

示例 1:

输入:nums = [1,2,0]
输出:3
示例 2:

输入:nums = [3,4,-1,1]
输出:2
示例 3:

输入:nums = [7,8,9,11,12]
输出:1

时间复杂度O(N),空间复杂度O(1)

class Solution {
    public int firstMissingPositive(int[] nums) {
        //没有出现的最小正整数一定在1-N+1当中
        //因为如果数组0-N-1位置都出现了1-N的数,则最小正整数是N+1
        //当存在位置出现的数不在1-N范围内,则最小正整数一定在1-N中
        //遍历数组,将数组中所有<=0的数都变为n+1
        //这里是因为想把数据都变成正数的情况下方便使用一个负号进行打标签
        int len = nums.length;
        for(int i = 0;i<len;i++)
        {
            if(nums[i]<=0)
                nums[i] = len+1;
        }
        //判断每个数num是否属于1-N,如果是则给数组中第num-1个位置对应的值添加负号,进行打标签
        for(int i = 0;i<len;i++)
        {
            //注意这里一定要获取绝对值
            //原因是一开始我以为上面已经将数组数据全部修为正数了,不会存在负数,所以绝对值没必要
            //但这一轮是要给元素打上负号标签变成负数,会修改元素的值,从而导致不一定都是正数了
            int ber = Math.abs(nums[i]);
            if(ber<=len)
                nums[ber-1] = -Math.abs(nums[ber-1]);
        }
        for(int i = 0;i<len;i++)
        {
            if(nums[i]>0)
                return i+1;
        }
        return len+1;
    }
}

 

posted @ 2021-03-11 10:11  γGama  阅读(38)  评论(0编辑  收藏  举报