缺失的第一个正数

缺失的第一个正数

题目

给你一个未排序的整数数组 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   oYYo  阅读(5)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示