首页 > 其他 > 详细

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

时间:2020-06-27 21:49:05      阅读:76      评论:0      收藏:0      [点我收藏+]

题目描述:

技术分享图片

 

 解题思路:

  这道题的解法很巧妙。首先思考一种边界情况,假如所有值都是有效值,即都是正整数并且连续,那么最大值就是数组的长度加一,否则但凡出现一个无效值,那么最大值都小于数组的长度。基于这个可以想到开辟一个与原数组长度相同的数组,假设长度表示为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;
    }
};

 

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

原文:https://www.cnblogs.com/yxsrt/p/13199789.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!