数组元素目标和
数组元素目标和
题目描述
求A[i] + B[j] == k 的 (i , j) 对
样例
输入
1
2
3
4 5 6
1 2 4 7
3 4 6 8 9
输出
1
1 1
(双指针) $O(n)$
i从 0开始 从前往后遍历
j从 m - 1开始 从后向前遍历
和纯暴力的$O(n^2)$ 算法的区别就在于
j指针不会回退
C++ 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5 + 10;
int n, m, k;
int a[N], b[N];
#define read(x) scanf("%d",&x)
int main()
{
read(n), read(m), read(k);
for (int i = 0; i < n; i ++ ) read(a[i]);
for (int i = 0; i < m; i ++ ) read(b[i]);
for (int i = 0, j = m - 1; i < n; i ++) {
//如果a[i]+b[i]<k则会一直往下递增i(不会递增j)
//当a[i]+b[j]也就是a[i]+b[m-1]>k时停下来,然后递减j直到和等于k
while(j >= 0 && a[i] + b[j] > k) j --;
if(j >= 0 && a[i] + b[j] == k) printf("%d %d\n", i, j);
}
return 0;
}
This post is licensed under CC BY 4.0 by the author.