题目描述输入一个递增排序的数组和一个数字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; } }