题意:
给定一个长度为 n 的排列 a ,问是否存在正整数 l,r 使得al,ar 均不为 al...r 中的最大值或最小值。
思路:暴力的时间复杂度过高,肯定得进行优化。 因为是要求一段序列,可以考虑双指针算法。
因为给的是一个序列,所以可以知道最大值和最小值。 所以用左右指针分别向内。
如果两个指针都不为最值,即可直接输出。否则,更新最值和指针。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int t;
void solve()
{
int n,a[200010];
cin>>n;
for (int i=1;i<=n;i++){
cin>>a[i];
}
int l=1,minn=1,maxn=n,r=n;
while(l<=r){
if(a[l]==minn){
l++;
minn++;
}
else if (a[l]==maxn){
l++;
maxn--;
}
else if (a[r]==maxn){
r--;
maxn--;
}
else if(a[r]==minn){
r--;
minn++;
}
else {
break;
}
}
if(l>r) cout<<-1<<endl;
else {
cout<<l<<" "<<r<<endl;
}
}
signed main()
{
cin>>t;
while(t--){
solve();
}
}
本体代码实现较简单,只要想到双指针即可。