这个算法用的很频繁,但是很多时候我们都不知道自己用了这个算法;
这个算法大多数是用于数组上面的,我们一般可以先写出一个暴力算法,然后可以通过设两个指针,来降低复杂度;
怎么设计两个指针呢?一般是找 i 和 j 之间的某种关系(一般是某种单调关系);
一般思路:
for(int i=0,j=0;i<n;i++){ while(j<=i&&check(i,j)) j++; mmax=max(mmax,j-i+1); }模板题:
给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。
输入格式 第一行包含整数n。
第二行包含n个整数(均在0~100000范围内),表示整数序列。
输出格式 共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。
代码:
#include<bits/stdc++.h> #define LL long long #define pa pair<int,int> #define lson k<<1 #define rson k<<1|1 //ios::sync_with_stdio(false); using namespace std; const int N=100100; const int M=200100; const LL mod=2e9+7; int a[N]; int v[N]; int main(){ ios::sync_with_stdio(false); int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int j=1; int mmax=0; for(int i=1;i<=n;i++){ v[a[i]]++; while(v[a[i]]>1){ v[a[j]]--; j++; } mmax=max(mmax,i-j+1); } cout<<mmax<<endl; return 0; }