题目描述

原题

题目大意&链接

在两个数组中,找出满足 A[i] + B[j] = x 的数对(i,j)。

输入输出样例:
输入:

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

输出:

1 1

详情:ac_800数组元素的目标和

解题思路

这题采用双指针的思想,具体:

  1. 定义 i 指针指向 A 数组的左端点,j 指针指向 B 数组的右端点向左移动,由于 A,B 都是递增有序数组,当 A[i] + B[j] = x 时输出这个答案并跳出循环,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)
    {
    printf("%d %d\n", i, j);
    break;
    }
    }

完整代码

#include<iostream>
#include<map>

using namespace std;

const int N = 1e5 + 10;

int n, m, x;
int A[N], B[N];

int main()
{
scanf("%d %d %d", &n, &m ,&x);
for(int i = 0; i < n; i++) scanf("%d", &A[i]);
for(int i = 0; i < m; i++) scanf("%d", &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)
{
printf("%d %d\n", i, j);
break;
}
}

return 0;
}

时间和空间复杂度

时间复杂度:O(n + m)
空间复杂度:O(n + m)