您的位置:首页 > 其它

First Missing Positive

2014-05-24 20:57 127 查看
First Missing Positive

这道题,数组里面的数会出现负数和零,这也就给我们解题带来了难度。

其实跳出来来想,我们只需要生成一张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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: