【LeetCode】41.缺失的第一个正数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bqw18744018044/article/details/89063323
  • 题目描述

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

  • 思路

假设数组nums大小为n,并假设数组中的数为{1,2,…,n},那么没有出现的最小正整数为n+1;不失一般性的,假设{1,2,…,n}的任意一个数换成负数、0或者大于n的数,那么没有出现的最小正整数就是被换掉的数。

所以,对应大小为n的数组,我们将介于[1,n]的数放在其对应的位置上(例如1放到nums[0],2放到nums[1]),对于负数、0或者大于n的数则不处理。然后重新遍历数组,第一个遇到的下标与数不对应的位置,其就是我们要找的数。

  • C++实现

    class Solution {
    public:
        int firstMissingPositive(vector<int>& nums) {
            int size = nums.size();
            if(size==0)return 1;
            for(int i=0;i<size;i++){
                //不停的将符合要求的nums[i]放到对应的地方,直至遇到不符合要求的数
                while(nums[i]>0&&nums[i]<=size&&nums[i]!=nums[nums[i]-1])
                    swap(nums[i],nums[nums[i]-1]);
            }
            for(int i=0;i<size;i++){
                if(nums[i]!=i+1)return i+1;
            }
            return size+1;//如果遍历完整个数组不存在这样的数,那么这个数就是size+1
        }
    };
    

 

猜你喜欢

转载自blog.csdn.net/bqw18744018044/article/details/89063323