leetcode【困难】41、缺失的第一个正数

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

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

示例 :

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

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

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

思路:
参考:26. 删除排序数组中的重复项【简单】原地操作

  1. 如果数组中包含 x ∈[1,N],那么恢复后,数组的第 x−1 个元素为 x。如果数组中的数都大于N,即返回 1,如示例3
  2. 对数组进行一次遍历,对于遍历到的数 x=nums[i],如果 ∈[1,N],我们就知道 x 应当出现在数组中的 x−1 的位置,因此交换 nums[i] 和 nums[x−1],这样 x 就出现在了正确的位置。
  3. 在完成交换后,新的nums[i] 可能还在 [1, N] 的范围内,我们需要继续进行交换操作,直到x不属于 [1,N]。
  4. 最后再遍历一次,第一个 nums[i]!=i+1,就是结果。否则返回最后一个数 N+1
class Solution {
    public int firstMissingPositive(int[] nums) {
        int n=nums.length;
        for(int i=0;i<n;i++){
            int x=nums[i];// x 应当出现在数组中的 x - 1的位置
            while(nums[i]>0 && nums[i]<=n && nums[i]!=nums[nums[i]-1]){//交换 x 和 nums[x−1]
                int temp=nums[nums[i]-1];//交换不能反过来,会越界
                nums[nums[i]-1]=nums[i];
                nums[i]=temp;     
                // int temp=nums[i]; //比如[3,4,-1,1],i=0,nums[i]=3
                // nums[i]=nums[nums[i]-1];//[-1,4,-1,1]
                // nums[nums[i]-1]=temp;//nums[i]-1=-2           
            }
        }
        for(int i=0;i<n;i++){
            if(nums[i]!=i+1) return i+1;
        }
        return n+1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值