缺失的第一个正数

缺失的第一个正数

题目

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

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例

示例 1:

输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。

示例 2:

输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。

示例 3:

输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。

思路

  • 寻找缺失的第一个正数,并且使用常数级的额外空间,那么就要考虑利用它本身的数组空间
  • 可以使用数组中的数放在相对应的位置,首先是寻找缺失的第一个正数,那么考虑的范围就是1-数组的长度减一,将这些数放在对应的位置上,然后再遍历一遍数组,对应位置不是对应数的就是缺失的一个数,比如说nums[2]存放的就应该是2,第一个不符合规律的就是要找的数字。

代码实现

public void test() {
        firstMissingPositive(new int[]{1,2,0});
    }
    public static int firstMissingPositive(int[] nums) {
        if(nums == null&&nums.length==0){
            return 1;
        }
        for (int i = 0; i < nums.length; i++) {
            //如果num[i] 大于0 且小于 num.lenght ,nums[i] != nums[nums[i] - 1] 防止死循环
            while (nums[i] != i + 1 && nums[i] > 0 && nums[i] < nums.length && nums[i] != nums[nums[i] - 1]  ){
                int temp = nums[i];
                nums[i] = nums[temp - 1];
                nums[temp - 1] = temp;
            }
        }
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != i + 1) {
                return i + 1;
            }
        }
        return nums.length + 1;
    }

posted on 2025-02-07 17:18  oYYo  阅读(23)  评论(0)    收藏  举报

导航