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;
}