目录
最长连续不重复子序列
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
const int N = 100010;
int a[N], s[N];
int main()
{
int n;
cin >> n;
for (int i = n; 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;
return 0;
}
最精华的地方
写个数组自己走一下就懂了
这样子用双指针就可以把O(n^2)的时间复杂度降成O(n)
数组元素的目标和
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
const int N = 100010;
int a[N], b[N];
int main()
{
int n, m, x;
cin >> n >> m >> x;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < m; i++)
cin >> b[i];
for (int i = 0, j = m - 1; i < n; i++)
{
while (j >= 0 && a[i] + b[j] > x)
j--;
if (a[i] + b[j] == x)
{
cout << i << " " << j;
break;
}
}
return 0;
}
判断子序列
#include<iostream>
using namespace std;
const int N=100100;
int n,m;
int a[N],b[N];
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<m;i++) scanf("%d",&b[i]);
int k=0;
for(int i=0,j=0;i<n;i++)
{
while(j<m&&a[i]!=b[j]) j++;
if(a[i]==b[j]&&j<m)
{
k++;
j++;
}
}
if(k==n) printf("Yes");
else printf("No");
return 0;
}