1.思路
这题不是很难,算是练习一下双指针算法吧。
首先,这两个数组都是排序的。并且保证答案唯一。我们可以用两个指针来指向a数组头部,以及b数组尾部,i只向右移,j只向左移。如果a[i] + b[j] > x,此时j会往左移,使得a[i] + b[j]总体值变小,更加接近x;否则i往右移。直到得到正确答案。
2.代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int x = in.nextInt();
int[] a = new int[n];
int[] b = new int[m];
for(int i = 0; i < n; i++)
a[i] = in.nextInt();
for(int i = 0; i < m; i++)
b[i] = in.nextInt();
int i = 0, j = m - 1; //i从a数组头部往右移,j从b数组尾部向左移
while(i < n && j >= 0) { //如果没有溢出
if(a[i] + b[j] == x) { //找到答案
System.out.println(i + " " + j);
break;
} else if(a[i] + b[j] > x) //此时j会往左移,使得a[i] + b[j]总体值变小,更加接近x
j--;
else //此时i会往左移,使得a[i] + b[j]总体值变大,更加接近x
i++;
}
}
}
3.复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n + m)