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

本文介绍了一种高效算法,用于在含n个整数的数组中查找未出现的最小正整数。算法利用辅助数组记录元素,通过两次遍历实现O(n)时间复杂度与O(n+1)空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个含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;i<n;i++){
		if(a[i]>0&&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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值