思路: 一开始以为这个题目比较好做,就用while循环和当前第i项和当前第i+1比较就可以,
但是一旦遇到特殊情况就应付不过来了。
然后学长在群里放了题解,这种思路真的值得学习啊。
说一下思路,
分两种情况:
1. 当前第i项比第i-1项大1时,例如 1 3 4 ,第i项是4,第i-1项是3,这种情况一定是,前面i-1不存在 某一项比它相邻一项大1的情况。所以保留第i-1项,让它的nex指针从i指向i+1,第i+1项的pre指针从i指向i-1这样就保证了,消除4。
2.当前第i项比第i-1项小1是,例如 2 4 3 ,第i项是3,第i-1项是4,这种情况会出现什么情况么,消除4,保留3 后,还剩下2,3。显然这两个数也是要进行“操作” 的,所以怎样变换nex指针和pre指针才是重点。假设2 4 3 的下标分别为 0 ,1,2 应该先把pre[i]的指针指向i,即 i = pre[i];
i从2—>1 然后 nex[pre[1]] 是什么意思呢,即2的下一个应该是 3 ,所以nex[pre[i]] = nex[i]
, 那么3的上一个应该也是2 ,所以pre[nex[i]] = pre[i],这样就把4消除,3去了4的位置。
AC代码:
#include <iostream>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn = 1e5+10;
int nex[maxn];
int pre[maxn];
int x[maxn];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
int n;
cin>>n;
x[0] = -2;
x[n+1] = -2;
for(int i=1;i<=n;i++)
cin>>x[i];
for(int i=0;i<=n+1;i++)
{
pre[i] = i-1;
nex[i] = i+1;
}
int i=1;
int ans = 0;
while(i<=n)
{
if(i == 0) i = nex[i];
if(x[i]-x[pre[i]] == 1)
{
nex[pre[i]] = nex[i];
pre[nex[i]] = pre[i];
i = pre[i];//
ans++;
continue;
}
if(x[i]-x[pre[i]] == -1)
{
i = pre[i];
nex[pre[i]] = nex[i];
pre[nex[i]] = pre[i];
i = pre[i];
ans++;
continue;
}
i = nex[i];
}
cout<<ans<<endl;
return 0;
}