缺失的第一个正数—leetcode41

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

示例 1:数组

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

示例 2:code

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

示例 3:blog

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

提示:排序

你的算法的时间复杂度应为O(n),而且只能使用常数级别的额外空间。索引

思路:将数值与下标产生联系,将nums[i]放到索引为nums[i]-1的位置,须要注意超出数组len的值与非正数不作处理直接跳过,最后遍历判断数值是否在正确的位置便可it

 

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int N = nums.size();
        for(int i=0;i<N;){
            //肯定nums[i]的值对应的下标不越界,同时排除num[i]自己位置正确或者nums[i]应该放入的位置nums[i]-1本来就是nums[i](如[1,1])
            if(nums[i]>0&&nums[i]<=N&&nums[i]!=nums[nums[i]-1]){
                //换位置以后须要继续判断换过来的值是否在对的位置上,所以不能i++;
                int index = nums[i];//
                nums[i] = nums[index -1];
                nums[index -1]=index;
            }else{
                i++;
            }
        }
        for(int i=0;i<N;i++){
            if(nums[i]!=i+1){
                return i+1;
            }
        }
        return N+1;
    }
};