【双指针】缺失的第一个正整数

在这里插入图片描述
改一下输入输出格式,第一行输入n,接下来输入n个整数,输出缺失的第一个正整数。这道题需要分情况讨论,用左程云老师的例子来举例,现在n=10,10个整数依次为-3,2,1,8,5,4,2,3,5,13,假设它们存储在数组a中,下标从1开始。我们定义两个变量l和r,l表示前l个(包括l)是已经顺好的(即下标1存放1,下标2存放2,下标3存放3,依此类推),从第r个位置开始存储不符合要求的整数,不符合要求的整数满足一下其中一个条件:
1)a[l]<l;(比如例子中的-3) 2) a[l]>r; (比如例子中的13)
3)a[a[l]]==a[l] (有重复的数)。
整体算法的流程是:初始化l=1,r=n+1,一开始假设全部都是顺好的。接着按以下情况去判断和操作:

情况操作说明
a[l]==ll=l+1当前的顺好了,就继续看下一个是否顺好
a[l]<lr=r-1, swap(a[l],a[r])把不符合要求的移到r右边,缩小符合要求的范围
a[l]>rr=r-1, swap(a[l],a[r])把不符合要求的移到r右边,缩小符合要求的范围
a[a[l]]==a[l]r=r-1, swap(a[l],a[r])把不符合要求的移到r右边,缩小符合要求的范围
除了以上四种情况的其他情况swap(a[l],a[a[l]])把当前元素交换到它应该在的位置

代码实现:

#include<bits/stdc++.h>
using namespace std;
int n,l,r,a[100005];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	l=1; r=n+1;
	while(l<=r){
		if(a[l]==l) l++;
		else if(a[l]>r||a[l]<l||a[a[l]]==a[l]){
			r--;
			swap(a[l],a[r]);
		} 
		else 
			swap(a[l],a[a[l]]); 
	}
	cout<<r+1<<endl;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值