Post

数组元素目标和

数组元素目标和

题目描述

求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指针不会回退

1.png

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.