双指针

题目描述

给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

【输入格式】

第一行包含整数 n

第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。

【输出格式】

共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。

【数据范围】

1≤n≤105

【输入样例】

5
1 2 2 3 5

【输出样例】

3

 

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 const int N = 100009;
 5 int a[N],s[N];
 6 int n,res;
 7 int main()
 8 {
 9     cin >> n;
10     for(int i = 0;i < n ;++i)
11         cin >> a[i];
12     for(int i = 0,j = 0;i < n;++i)
13     {
14         s[a[i]]++;
15         while(s[a[i]] > 1)
16         {
17             s[a[j]]--;
18             j++;
19         }
20         res = max(res,i - j + 1);
21     }
22     cout << res << endl;
23     return 0;
24 }

 

 

 


 

题目描述

给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。

数组下标从 0 开始。

请你求出满足 A[i]+B[j]=x 的数对 (i,j)。

数据保证有唯一解。

【输入格式】

第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。

第二行包含 n 个整数,表示数组 A。

第三行包含 m 个整数,表示数组 B。

【输出格式】

共一行,包含两个整数 i 和 j

【数据范围】

数组长度不超过 105
同一数组内元素各不相同。
1≤数组元素≤109

【输入样例】

4 5 6
1 2 4 7
3 4 6 8 9

【输出样例】

1 1

 

 1 #include <iostream>
 2 using namespace std;
 3 const int N = 100009;
 4 int a[N],b[N];
 5 int main()
 6 {
 7     int n,m,x;
 8     cin >> n >> m >> x;
 9     for(int i = 0;i < n;++i)
10     {
11         cin >> a[i];
12     }
13     for(int i = 0;i < m;++i)
14     {
15         cin >> b[i];
16     }
17     for(int i = 0,j = m - 1;i < n;++i)
18     {
19         while(j >=0 && (a[i] + b[j]) > x)
20         {
21             j--;
22         }
23         if(a[i] + b[j] == x)
24             cout << i << " " << j << endl;
25     }
26     return 0;
27 }

 

 


 

题目描述

给定一个长度为 nn 的整数序列 a1,a2,…,an 以及一个长度为 mm 的整数序列 b1,b2,…,bm。

请你判断 a 序列是否为 b 序列的子序列。

子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5} 是序列{a1,a2,a3,a4,a5} 的一个子序列。

输入格式

第一行包含两个整数 n,m。

第二行包含 n 个整数,表示 a1,a2,…,an。

第三行包含 m 个整数,表示 b1,b2,…,bm。

输出格式

如果 a 序列是 b 序列的子序列,输出一行 Yes

否则,输出 No

数据范围

1≤n≤m≤105,
−109≤ai,bi≤109

输入样例:

3 5
1 3 5
1 2 3 4 5

输出样例:

Yes

 

 1 #include <iostream>
 2 using namespace std;
 3 const int N = 100009;
 4 int a[N],b[N];
 5 int n,m;
 6 int main()
 7 {
 8     cin >> n >> m;
 9     for(int i = 0;i < n;++i)
10         cin >> a[i];
11     for(int i = 0;i < m;++i)
12         cin >> b[i];
13     int match = 0;
14     for(int i = 0,j = 0;i < n && j < m;++j)
15     {
16         if(a[i] == b[j])
17         {
18             match++;
19             i++;
20         }
21     }
22     if(match == n)
23         cout << "Yes" << endl;
24     else
25         cout << "No" << endl;
26     return 0;
27 }

 

posted @ 2021-10-16 19:57  Modest-Hamilton  阅读(25)  评论(0)    收藏  举报