2018 找到最小的未出现的正整数

给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1, 2, 3}中未出现的最小正整数是4。

算法:用一个辅助数组b[n+1]记录a[n]中元素的是否出现,初始全部为0。例如如果a[0]=1,则b[1]=1,a[3]=2,则b[2]=1;
如果a[i]>n则不记录,因为如果1-n中元素没有全部出现则缺少的元素一定在1-n中无需记录大于n的数是否出现。
遍历一次a数组记录是否出现,再遍历一次b数组看是否存在为0的元素(从下标为1开始循环到n),找到第一个退出循环。
如果没有中途退出而是正常结束循环,说明答案为n+1.
算法时间复杂度为O(n),因为使用了辅助数组,所以空间复杂度为O(n+1)。 

void find_min_miss(int a[],int n){
	int b[n+1];
	for(int i=0;i0&&a[i]<=n)	b[a[i]]=1;
	}
	int i;
	for(i=1;i<=n;i++){
		if(b[i]==0) break;
	}
	if(i==n+1) return n+1;
	else return i;
}

 

你可能感兴趣的:(2018 找到最小的未出现的正整数)