解析
核心作用:将两重循环优化为一重循环,将 O ( n 2 ) O(n^2) O(n2)优化为 O ( n ) O(n) O(n)。归并也是用的双指针算法
运用某些单调性质,。
模板
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
↓ ↓ ↓
for(int i=0,j=0;i<n;i++){
while(j<i&&check(i,j))j++;
}
例题
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10;
int a[N],s[N];
int n;
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
int res=-1;
for(int i=0,j=0;i<n;i++){
s[a[i]]++;
while(j<i&&s[a[i]]>1){
s[a[j]]--;
j++;
}
res=max(res,i-j+1);
}
cout<<res;
return 0;
}
#include <iostream>
using namespace std;
const int N = 1e5+10;
int n,m,x;
int a[N],b[N];
int main(){
scanf("%d%d%d", &n, &m,&x);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<m;i++)scanf("%d",&b[i]);
for(int i=0,j=m-1;i<n;i++){
while(j>=0&&a[i]+b[j]>x)j--;
if(j>=0&&a[i]+b[j]==x)cout<<i<<" "<<j<<endl;
}
return 0;
}