41. 缺失的第一个正数(First Missing Positive)

题目描述:

 

 解题思路:

  这道题的解法很巧妙。首先思考一种边界情况,假如所有值都是有效值,即都是正整数并且连续,那么最大值就是数组的长度加一,否则但凡出现一个无效值,那么最大值都小于数组的长度。基于这个可以想到开辟一个与原数组长度相同的数组,假设长度表示为n。把所有值在(1,n)之间的数装进数组,没有装入的位置默认值为0,最后只用判断第一个出现0的坐标,就可以得知缺少的最小值。如果数组中没有0,就说明最小值是n+1。其实数组的元素只需要一位就够了,有对应元素为1,反之为0,同样可行。

  但是这道题要求空间复杂度为O(1),所以还需要进一步的思考。其实不需要开辟一块同样长度的数组,直接在原数组上操作就行。每次把值swap到对应坐标的元素上,直到所有元素都归位。最后和之前一样遍历这个数组,第一个元素值与坐标不符的就是答案,最小值为坐标加1。如果都符合,则最小值为数组长度加1。

  注意判断特殊情况,避免死循环。

  代码如下:

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        for (int i = 0; i < nums.size(); ++i) {
            while (nums[i] != (i + 1) && nums[i] > 0 && nums[i] <= nums.size() && nums[i] != nums[nums[i] - 1])
                swap(nums[i], nums[nums[i] - 1]);
        }
        int i = 0;
        for ( ; i < nums.size(); ++i)
            if (nums[i] != i + 1)
                break;
        if (i == nums.size())
            return nums.size() + 1;
        else
            return i + 1;
    }
};

 

posted @ 2020-06-27 20:54  简讯  阅读(221)  评论(0编辑  收藏  举报