今天学习了双指针算法
#include<iostream>
using namespace std;
const int N = 100010;
int n;
int a[N], s[N];
int main()
{
cin >> n;
for(int i = 0; i < n; i ++ ) cin >> a[i];
int res = 0;
for(int i = 0, j = 0; i < n; i ++ )
{
s[a[i]] ++ ;
while(s[a[i]] > 1)
{
s[a[j]] -- ;
j ++ ;
}
res = max(res, i - j + 1);
}
cout << res << endl;
return 0;
}
模板:
for (int i = 0, j = 0; i < n; i ++ )
{
while (j < i && check(i, j)) j ++ ;
// 具体问题的逻辑
}
常见问题分类:
(1) 对于一个序列,用两个指针维护一段区间
(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作
然后就是这个两个字符串的双指针,我自己尝试了双指针的写法没有写出来,值得一提的是,这题我用stl的map成功写出来了。
#include<iostream>
#include<map>
using namespace std;
map<int,int>mp;
int a[100010];
int main()
{
int n,m,x;
int i,j,p;
cin >> n >> m >> x;
for(i = 0;i < n;i ++ )
{
cin >> a[i];
mp.insert(map<int,int>::value_type(a[i],i));
}
for(i = 0;i < m; i ++ )
{
cin >> p;
map<int,int>::iterator it;
it = mp.find(x-p);
if(it != mp.end())
cout<<it->second<<" "<<i;
}
return 0;
}
然后我去看了下双指针的代码:
#include<iostream>
using namespace std;
int a[100010],b[100010];
int main()
{
int n,m,x;
cin >> n >> m >> x;
int i,j,k;
for(i = 0 ;i < n ; i ++ )
cin>>a[i];
for(j = 0; j < m ; j ++ )
cin>>b[j];
for(i = 0,j = m-1;i < n;i ++ )
{
while(a[i] + b[j] > x && j >=0)
j--;
if(a[i] + b[j] == x)
{
cout<<i<<" "<<j;
break;
}
}
return 0;
}
注意循环是i = 0,j = m - 1。