17.缺失的第一个正数

给你一个未排序的整数数组 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.length <= 105
  • -231 <= nums[i] <= 231 - 1

代码:

class Solution {
    public int firstMissingPositive(int[] nums) {
        //数组长度
        int n = nums.length;
        //遍历数组
        for(int i=0;i<n;i++){
            //循环将所有num[i]>=1而且num[i]<=n的数都放到正确的位置,nums[i]放到下标为num[i]-1的位置
            //如果 nums[i] 恰好与 nums[x−1] 相等,那么就会无限交换下去,此时跳出循环
            while(nums[i]>=1&&nums[i]<=n&&nums[nums[i]-1]!=nums[i]){
                int temp = nums[nums[i]-1];
                nums[nums[i]-1]=nums[i];
                nums[i]=temp;
            }
        }
        //在恢复后,数组应当有 [1, 2, ..., N] 的形式,但其中有若干个位置上的数是错误的,每一个错误的位置就代表了一个缺失的正数,以题目中的示例二 [3, 4, -1, 1] 为例,恢复后的数组应当为 [1, -1, 3, 4],我们就可以知道缺失的数为 2
        for(int i=0;i<n;i++){
            if(nums[i]!=i+1)return i+1;
        }
        //如果恢复后是[1,2...N],则缺失的数肯定是N+1
        return n+1;
    }
}
posted @ 2025-04-17 09:40  回忆、少年  阅读(10)  评论(0)    收藏  举报