给定一个数组 A[]
元素如下:
4,5,-2,1,2
那么数组中第一个不见的正整数为 3
要求时间复杂度为o(n)
在上一篇blog中求了一个最长连续序列,用到了unoredered_map,其实这个地方也可以用到,将数组中的元素投影到unordered_map中,然后从1开始找,知道找不到了为止
代码如下
<span style="font-size:18px;">class Solution {
public:
int firstMissingPositive(int A[], int n) {
unoredered_map<int,int> mp;
int i,j;
for(i=0;i<n;i++)
{
mp[A[i]]=1;
}
j=1;
i=0;
while(i<n)
{
if(mp.count[j])
j++;
else
break;
i++;
}
return j;
};</span>
下面不使用map来进行排序。数组长度为n,那么该数一定小于等于n+1
所以我们如果将每一个对应的元素A[i]放到原本属于它的位置上面去,如元素1放在A[0]中,其他的也类似,但是数组中肯定有不符合的数据,如小于0的,大于n的,还有就是重复的正整数,这些数据可以不用交换。
类似于桶排序。
代码如下
<span style="font-size:18px;">class Solution {
public:
int firstMissingPositive(int A[], int n) {
newsort(A,n);
int i;
for(i=0;i<n;i++)
{
if(A[i]!=i+1)
return i+1;
}
return n+1;
}
void newsort(int A[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
while(A[i]!=i+1)
{
if(A[i]<=0||A[i]>n||A[i]==A[A[i]-1])
break;
swap(A[i],A[A[i]-1]);
}
}
}
};</span>