LeetCode - First Missing Positive **

本文介绍了一种在O(1)空间复杂度下寻找数组中最小缺失正整数的有效算法。通过巧妙利用数组自身存储额外信息而不使用额外空间,实现了高效查找。文章提供了两种实现方法,一种通过循环替换数组元素值,另一种则采用负值标记法。

这题很有意思。

如果不考虑空间复杂度,可以用一个数组tmp通过线性扫描A[],存放1-n的出现情况,然后再扫描一次tmp即可。

但是如果O(1)空间复杂度的话,就得在原地保存信息。

基本思想是:如果i存在,则令A[i-1] = n+1。但是这样A[i-1]原来的信息就丢失了,所以用一个变量tmp保存A[i-1]的值,再判断A[tmp-1]是否为n+1,如果不是,则令A[tmp-1]为n+1,同时自然需要保存A[tmp-1]原有值,这样循环直到A[tmp-1]为n+1停止。


class Solution {
public:
    int firstMissingPositive(int A[], int n) {
		if(n<1)
			return 1;
        for(int i=0;i<n;++i)
			if(A[i]==(n+1))
				++A[i];
		for(int i=0;i<n;++i){
			if(A[i]<=0 || A[i]>n)
				continue;
			int tmp = A[A[i]-1];
			A[A[i]-1] = n+1;
			while(tmp<=n &&tmp>0 && A[tmp-1]!=(n+1)){
                int tmp2 = A[tmp-1];
                A[tmp-1] = n+1;
				tmp = tmp2;
			}
		}
		int i=0;
		while(A[i]==(n+1))
			++i;
		return i+1;
	}
};


啊!后来看到一个更精妙的解法。要保存原有信息可以将其转为负值用于保存结果,取绝对值即可得到其原值。

class Solution {
public:
    int firstMissingPositive(int A[], int n) {
		if(n<1)
			return 1;
		for(int i=0;i<n;++i)
			if(A[i]<=0)
				A[i] = n+2;
		for(int i=0;i<n;++i){
			if(abs(A[i])>n)
				continue;
			A[abs(A[i])-1] = -abs(A[abs(A[i])-1]);
		}
		int i=0;
		while(A[i]<0)
			++i;
		return i+1;
	}
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值