$$\color{Red}{数组元素的目标和【双指针】-三种语言代码}$$
这里附带打个广告——————我做的所有的题解
包括基础提高以及一些零散刷的各种各样的题
题目介绍
给定两个升序排序的有序数组 A 和 B,以及一个目标值 x
数组下标从 0 开始。
请你求出满足 A[i]+B[j]=x 的数对 (i,j)。
数据保证有唯一解。
输入格式
第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。
第二行包含 n 个整数,表示数组 A。
第三行包含 m 个整数,表示数组 B。
输出格式
共一行,包含两个整数 i 和 j。
数据范围
数组长度不超过 10 ^ 5。
同一数组内元素各不相同。
1 ≤ 数组元素 ≤ 10 ^ 9
输入样例:
4 5 6
1 2 4 7
3 4 6 8 9
输出样例:
1 1
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int n, m, x, N = 100010;
static int[] a = new int[N];
static int[] b = new int[N];
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
String[] s1 = br.readLine().split(" ");
n = Integer.parseInt(s1[0]);
m = Integer.parseInt(s1[1]);
x = Integer.parseInt(s1[2]);
String[] s2 = br.readLine().split(" ");
String[] s3 = br.readLine().split(" ");
for (int i = 0; i < n; i++) a[i] = Integer.parseInt(s2[i]);
for (int i = 0; i < m; i++) b[i] = Integer.parseInt(s3[i]);
for (int i = 0, j = m - 1; i < n; i++) {
while (a[i] + b[j] > x) j --;
if (a[i] + b[j] == x){
System.out.println(i + " " + j);
return;
}
}
}
}
python3
n, m, x = map(int, input().split())
arr1 = [int(x) for x in input().split()]
arr2 = [int(x) for x in input().split()]
j = m - 1
for i in range(n):
while arr1[i] + arr2[j] > x:
j -= 1
if arr1[i] + arr2[j] == x:
print('%d %d' % (i, j))
break
C++
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int main()
{
int n, m, x;
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;
}