算法练习week10--leetcode41

题目:

给一无序数组,找到数组中从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;
    }
};
 

猜你喜欢

转载自blog.csdn.net/pygmelion/article/details/84245264
今日推荐