zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    java servlet手机app访问接口(三)高德地图云存储及检索
    java servlet手机app访问接口(二)短信验证
    java servlet手机app访问接口(一)数据加密传输验证
    java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)
    java servlet Json.org.jar
    java Servlet(续)
    [HAOI2015]树上操作
    [USACO15DEC]最大流Max Flow
    [NOI2015]软件包管理器
    [洛谷P3384]【模板】树链剖分
  • 原文地址:https://www.cnblogs.com/yxsrt/p/13199789.html
Copyright © 2011-2022 走看看