LeetCode No41. 缺失的第一个正数

题目

给你一个未排序的整数数组 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 * 10^5
-2^31 <= nums[i] <= 2^31 - 1

思路

常规方法其实就是先排序,然后再找最小缺失的正整数,但是这样时间复杂度为O(n*logn)。想要以O(n)的复杂度去完成的话,就是用哈希的思想了,数据长度为5*10^5,只要我们把出现的数按照其下标存起来,然后再遍历这个范围内的数,哪个下标没有存值也就代表哪个数字没有出现过。

AC代码

点击查看代码
public 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 num = nums[nums[i]-1];
                nums[nums[i]-1] = nums[i];
                nums[i] = num;
            }
        }
        int index = 0;
        for(; index<len; index++) {
            if( nums[index]!=index+1 ) {
                break ;
            }
        }
        return index+1;
    }
}
posted @ 2022-05-15 21:37  Asimple  阅读(13)  评论(0编辑  收藏  举报