标签:
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)的时间复杂度和常数空间复杂度。
先排序,然后遍历数组,找出第一个不出现的正整数。但时间复杂度为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; }
对于正整数A[i],如果将它放在数组中满足A[i]=i+1的位置,那么如果当某个位置不满足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; } };
(LeetCode 41)First Missing Positive
标签:
原文地址:http://www.cnblogs.com/AndyJee/p/4472098.html