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

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    

以上是关于leetcode困难41缺失的第一个正数的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode 41.] 缺失的第一个正数

LeetCode 41. 缺失的第一个正数 | Python

[leetcode] 41. 缺失的第一个正数

leetcode 41 缺失的第一个正数

leetcode——41. 缺失的第一个正数

LeetCode 41. 缺失的第一个正数