zoukankan      html  css  js  c++  java
  • (LeetCode 41)First Missing Positive

    Given an unsorted integer array, find the first missing positive integer.

    For example,
    Given [1,2,0] return 3,
    and [3,4,-1,1] return 2.

    Your algorithm should run in O(n) time and uses constant space.

    题目:

    给一无序数组,找到数组中从1开始第一个不出现的正整数。

    要求O(n)的时间复杂度和常数空间复杂度。

    思路:

    1、方法一:

    先排序,然后遍历数组,找出第一个不出现的正整数。但时间复杂度为O(nlogn),不符合要求。

    实现如下:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int firstMissPositive(int A[],int n){
        sort(A,A+n,less<int>());
        int i=0;
        while(A[i]<=0) i++;
        int j=1;
        while(i<n){
            if(i<n-1 && A[i]==A[i+1]) i++;
            if(A[i]!=j) break;
            i++;
            j++;
        }
        return j;
    }
    
    int main()
    {
        int A[]={4,4,3,-1,-2,2,1};
        int n=sizeof(A)/sizeof(A[0]);
        cout<<firstMissPositive(A,n);
        return 0;
    }

    2、方法二:

    对于正整数A[i],如果将它放在数组中满足A[i]=i+1的位置,那么如果当某个位置不满足A[i]==i+1时,则i为第一个不出现的正整数。

    • 遍历数组,
      • 当遇到小于n(n为数组大小)的正整数,如果它满足A[i]=i+1,则跳过,i++,如果不满足则将它交换它属于它的位置,即swap(A[i],A[A[i]-1]);
      • 当遇到小于0或者大于n的数,或者需交换的位置已经有了满足条件的值即A[i]==A[A[i]-1](数组中有重复数字的时候会有这种情况),则跳过,i++,因为没有合适的位置可以跟它们交换。
    • 再次遍历数组,如果A[i]!=i+1,则i为第一个不出现的正整数。

    代码如下:

    class Solution {
    public:
        void swap(int &a,int &b){
            int tmp;
            tmp=a;
            a=b;
            b=tmp;
        }
        int firstMissingPositive(vector<int>& nums) {
            int n=nums.size();
    //      if(n==0) return 1;
            int i=0;
            while(i<n){
                if(nums[i]==i+1 || nums[i]==nums[nums[i]-1] || nums[i]<=0 || nums[i]>n)
                    i++;
                else
                    swap(nums[i],nums[nums[i]-1]);
            }
            
            for(i=0;i<n;i++){
                if(nums[i]!=i+1)
                    break;
            }
            return i+1;
        }
    };
  • 相关阅读:
    常见浏览器的兼容问题以及解决方案 (仅供参考)
    了解浏览器如何工作—渲染引擎1
    维基百科公式不能正常显示
    IDL读取fits文件
    卷积,系统
    硬盘被占用无法拔出问题解决
    Faster RCNN 改进论文及资料
    Pycharm 使用问题一览
    java eclipse 使用随笔
    Images
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4472098.html
Copyright © 2011-2022 走看看