1. 本题知识点
数学,双指针
2. 题目描述
输入一个递增排序的数组和一个数字 S,在数组中查找两个数,使得他们的和正好是 S,如果有多对数字的和等于 S,输出两个数的乘积最小的。
3. 解题思路
-
使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。
-
如果两个指针指向元素的和 sum < S,移动较小的元素指针,使 sum 变大一些。
-
如果两个指针指向元素的和 sum > S,移动较大的元素指针,使 sum 变小一些。
-
如果两个指针指向元素的和 sum == S,那么返回这两个元素。
4. 代码
import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
// 一个指针指向元素较小的值
int low = 0;
// 一个指针指向元素较大的值
int high = array.length - 1;
while (low < high) {
// 两个指针指向元素的和 s
int s = array[low] + array[high];
// 如果 s == sum,那么返回这两个元素。
if (s == sum) {
return new ArrayList<>(Arrays.asList(array[low], array[high]));
}
// 如果 s < sum,移动较小的元素指针,使 s 变大一些。
else if (s < sum) {
low++;
}
// 如果 s > sum,移动较大的元素指针,使 s 变小一些。
else {
high--;
}
}
return new ArrayList<>();
}
}