1.数组求和

思路:a数组和b数组是从0开始的,用双重for循环枚举每一种情况。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,k,a[N],b[N];
int main(){
	cin>>n>>m>>k;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<m;i++){
		cin>>b[i];
	}
	int j=m-1;
	for(int i=0;i<n;i++){
		if(a[i]+b[j]==k){
			cout<<i<<" "<<j<<endl;
			break;
		}else if(a[i]+b[j]>k){
			j--;
		}
	}
	return 0;
}

2.滑动窗口

思路:把每一种情况都枚举出来,一起判断,判断的结果存储在两个变量里输出。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int arr[N];
int q[N],head=0,tail=0;
int n,k;
int main(){
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;++i){
		scanf("%d",&arr[i]);
	}
	for(int i=0;i<n;++i){
		if(i>=k&&q[head]==i-k){
			head++;
		}
		while(head<tail&&arr[i]<=arr[q[tail-1]]){
			tail--;
		}
		q[tail++]=i;
		if(i>=k-1){
			printf("%d ",arr[q[head]]);
		}
	}
	cout<<endl;
	for(int i=0;i<n;++i){
		if(i>=k&&q[head]==i-k){
			head++;
		}
		while(head<tail&&arr[i]>=arr[q[tail-1]]){
			tail--;
		}
		q[tail++]=i;
		if(i>=k-1){
			printf("%d ",arr[q[head]]);
		}
	}
	return 0;
}

3.最长连续不重复子序列

思路:把每一位都判断一下是否和前面的数字有重复,如果没有,那么不重复的子序列加一。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,a[N],m,maxn,b[N],res;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	int j=0;
	for(int i=0;i<n;i++){
		b[a[i]]++;
		
		while(j<i&&b[a[i]]>1){
			b[a[j]]--;
			j++;
		}
		res=max(res,i-j+1);
		//cout<<res<<endl;
	}
	cout<<res;
	return 0;
}