这道题,数组里面的数会出现负数和零,这也就给我们解题带来了难度。
其实跳出来来想,我们只需要生成一张map,然后将数组里的数记录下来,然后从1开始去找,找到第一个missing的数字,就得到了答案
class Solution {
public:
int firstMissingPositive(int A[], int n) {
if(n==0)
return 1;
map<int,int> mp;
for(int i =0;i<n;i++)
{
mp[A[i]]=1;
}
int ans = -1;
for(int i =1;i<=n+1;i++)
{
if(mp[i]==0)
return i;
}
}
};
结果,仔细看了下题,他要求constant space。所以不能再生成新的hash表。不知道为什么这里Leetcode这里能够通过。
那么,既然不能再用多余的空间,那么我们就把这个数组自身进行一些变化。
首先,我们假设这个数组没有负数和0
A = 5, 7 , 6, 4 , 3 , 1
第一个数时5,那么把数组第五位取负,变成
A = 5, 7, 6 , 4, -3, 1
第二个数7,第七个数取负,超过数组大小了,不予操作
第三个数6:
A = 5, 7, 6, 4, -3, -1
……
最终得到
A=-5, 7, -6, -4, -3, -1
找到第一个不为负的数,就是7,角标为1,所以缺少的是2
那么有负数和0,的情况 在上面的数字7其实就是借鉴的方法,把他设为大于数组位数的数
class Solution {
public:
int firstMissingPositive(int A[], int n) {
int i;
for(i=0;i<n;++i)
{
if(A[i]<=0)
A[i] = n+2;
}
for(i=0;i<n;++i)
{
if(abs(A[i])<=n)
{
int index = abs(A[i])-1;
A[index] = -abs(A[index]);//注意这里的abs很容易忽略,这里是为了防止数组里面有相同的数字出现。
}
}
for(i=0;i<n;++i)
if(A[i] > 0)
return i+1;
return n+1;
}
};