双指针法学习笔记

mac2025-09-15  21

双指针法

这个算法用的很频繁,但是很多时候我们都不知道自己用了这个算法;

这个算法大多数是用于数组上面的,我们一般可以先写出一个暴力算法,然后可以通过设两个指针,来降低复杂度;

怎么设计两个指针呢?一般是找 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; }
最新回复(0)