双指针算法
最大不重复数组
学习了新的语法,主要是vector<int>。
emm,这个的原理很简单,就是用左右两个指针和维护一个最后出现位置数组。如果发现最后出现位置不是-1,那么去和左指针比较,如果左指针小就更新。
#include<iostream>
#include<vector>
using namespace std;
void getlong(vector<int> & a){
int n = a.size();
int l = 0; int r = 0;
vector<int> lastloc(100001,-1);
int maxlen = 0;
for (r = 0; r < n; r ++ ){
if(lastloc[a[r]]!=-1){
l=max(l,lastloc[a[r]]+1);
}
lastloc[a[r]] = r;
maxlen = max(maxlen,r-l+1);
}
cout << maxlen;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i ++ ){
cin>>a[i];
}
getlong(a);
return 0;
}
目标数组和
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
void query(vector<int> &A, vector<int> &B, int x){
int n = A.size();
int m = B.size();
//这道题目纯自己想的,思路是维护一个位置数组
//如果记录对应数字的位置,到时候做差直接查询,就不用一个一个比较了。
unordered_map<int,int> Bloc;
for (int i = 0; i < m; i ++ ){
Bloc[B[i]] = i;
}
//以上消耗的是n+m
//接下来直接开查
int diff = 0;
for (int i = 0; i < n; i ++ ){
diff = x - A[i];
if(Bloc.find(diff)!=Bloc.end()){
cout<< i << " " << Bloc[diff]<<endl;
return;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,x;
cin >> n >> m >> x;
vector<int> A(n);
vector<int> B(m);
for (int i = 0; i < n; i ++ ){
cin >> A[i];
}
for (int i = 0; i < m; i ++ ){
cin >> B[i];
}
query(A,B,x);
return 0;
}
理论上应该用双指针的误打误撞用哈希表解决了,方法是直接存储对应数字的位置,如果存在且是对应的差,就拿取。
正解是两个指针一个是i从开头开始,一个是j从结尾开始,大了,j变小,小了i变大。下一题目用哈希表糊弄不过去了。
子序列
两个指针看着,小的序列如果指到最后那么说明就是。
#include <vector>
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
int n,m;
cin >> n >> m;
vector<int> a(n);
vector<int> b(m);
for (int i = 0; i < n; i ++ ) cin>>a[i];
for (int i = 0; i < m; i ++ ) cin>>b[i];
int p,q;
p = 0; q=0;
while(q<m&&p<n){
if(b[q]==a[p]){
p++;
q++;
}else q++;
}
if(p==n) cout << "Yes";
else cout << "No";
return 0;
}
浙公网安备 33010602011771号