zoukankan      html  css  js  c++  java
  • leetcode 41. First Missing Positive

    https://www.cnblogs.com/grandyang/p/4395963.html

    https://www.jianshu.com/p/cf82ce91dc3d

    找第一个消失的数,比如[2,3,4],第一个消失的就是1

    还是把值和索引相对应重新排数组,重新生成数组后,找第一个不满足的值等于索引的 

    错误解法1:

    [1,1]的时候会死循环

    这种写法,错误在nums[i] != i+1,这种写法不能解决出现两个相同数字的情况。nums[nums[i] - 1] != nums[i]的写法能解决如果index那个位置已经放好了满足要求的数,就可以退出循环。

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

    错误解法2:

    {3,4,-1,1}会错误

    swap要一直循环。

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

    正确解法:

    class Solution {
    public:
        int firstMissingPositive(vector<int>& nums) {
            for(int i = 0;i < nums.size();i++){
                while(nums[i] <= nums.size() && nums[i] > 0 && nums[nums[i] - 1] != nums[i])
                    swap(nums[i],nums[nums[i] - 1]);
            }
            for(int i = 0;i < nums.size();i++){
                if(nums[i] != i + 1)
                    return i + 1;
            }
            return nums.size() + 1;
        }
    };
    复杂度分析
    虽然这个思想还是蛮好理解,但是在一个for循环里又出现了一个while循环,它的复杂度能是O(n)吗?其实是酱紫,算法复杂度应该看的是基本操作的次数,在这个问题里,基本操作指的是交换操作,而每次交换操作,都至少有一个数字去了它应该去的地方,那么一个n长度的数组,最多只需要n次交换操作,所以它的复杂度是O(n)的~
  • 相关阅读:
    A+B
    Java(2)数据类型转换、变量和常量
    1002. 写出这个数 (20)
    1001.害死人不偿命的(3n+1)
    ACM算法目录
    《mysql必知必会》学习_第19章
    Redhat 6.1安装ArcGIS Server10.1
    ArcGIS 10.1 for Server安装教程系列—— Linux下的单机安装
    ArcGIS 10.1 for Server安装教程系列—— Linux下的单机安装
    Linux ANSI 乱码问题
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10908518.html
Copyright © 2011-2022 走看看