【基础算法(五) 双指针】

 最长连续不重复序列

#include
using namespace std;
const  int N=100010;
int arr[N],s[N];
int main(){
	int n;
	cin>>n;
	for (int i=0;i>arr[i];
	int res=0;
	for(int i=0,j=0;i1){//超过1次,说明有重复
			s[arr[j]]--;
			j++;
		}
		res=max(res,i-j+1);
	}
	cout<

两个单调递增的数组元素目标和 

【基础算法(五) 双指针】_第1张图片

优化后的:

#include
using namespace std;
int arr[100001];
int brr[100001];
int main(){
	int n,m,x;
	cin>>n >>m >>x;
	for(int i=0;i>arr[i];
	for(int i=0;i>brr[i];
	
	for(int i=0,j=m-1;i=0&&arr[i]+brr[j]>x) j--;
		if(arr[i]+brr[j]==x) {
				cout<

 判断子序列

【基础算法(五) 双指针】_第2张图片

思想:找一个指针j,从前往后遍历长的序列;指针i指向短的序列,当两个指针指的相等时,i++,注意:j每次都要向后移动;当j遍历完后,需要判断i是不是全和j对应上了

#include
using namespace std;
int arr[100001];
int brr[100001];
int main(){
	int n,m;
	cin>>n >>m;
	for(int i=0;i>arr[i];
	for(int i=0;i>brr[i];
	int i=0,j=0;
	while(i

你可能感兴趣的:(算法,数据结构,c++)