题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。返回值描述:对应每个测试案例,输出两个数,小的先输出。
###求解方法:双指针
1.初始化:指针l指向数组头, 指针r指向数组尾
2. 如果array[l] + array[r]== sum , 说明是可能解
3. 否则如果array[l] + array[r] > sum, 说明和太大,所以--r
4. 否则如果array[l] + array[r] < sum, 说明和太小,所以++l
注意:升序数组中,当最外层两个数和里层两个数和相等时,外层两个数乘积必然小于里层两个数
故题目即使要求输出乘积最小的两个数,用双指针法一旦找到外层和为sum就可直接返回,不必再找。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
ArrayList<Integer> result = new ArrayList<>();
if (array == null || array.length<2) {
return result;
}
int l = 0;
int r = array.length - 1;
int mul = Integer.MAX_VALUE;
while (l < r) {
if (array[l] + array[r] < sum) {
l++;
}
if (array[l] + array[r] > sum) {
r--;
}
if (array[l] + array[r] == sum) {
if (array[l] * array[r] < mul) {
mul = array[l] * array[r];
result.clear();
result.add(array[l]);
result.add(array[r]);
return result;
}
}
}
return result;
}
}


京公网安备 11010502036488号