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;
        }
    };
  • 相关阅读:
    20年美亚杯WRITE UP
    博客搬迁
    前端工程化1-模块
    移动端(h5)工具函数--视口适配(viewport)
    Understanding ES6 Modules(译)
    手写http请求并发、重试、超时函数
    两道编程题引发的思考
    前端基础走查(六):异步任务和事件循环
    vue 本地图片批量下载以及压缩成zip文件下载
    mybatis generator逆向工程
  • 原文地址:https://www.cnblogs.com/yxsrt/p/13199789.html
Copyright © 2011-2022 走看看