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;
        }
    };
  • 相关阅读:
    动态传参
    函数的介绍
    文件的操作
    send email with formatted table
    minimize and close window with customed winform
    python algorithm
    something important about docker
    book list
    which language is suitable for what to do
    Find Duplicate Items in list fast
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4472098.html
Copyright © 2011-2022 走看看