First Missing Positive

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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值