题目
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输入描述
对应每个测试案例,输出两个数,小的先输出。
思路
由于是递增数组。我们可采用双指针去计算。
left = 0 ;right = 数组的长度 - 1
- 求出left和right当前位置的两个数的和
- 如果
a[left] + a[right] > sum
- 说明
a[right]
过大。因此需要将right--
- 说明
- 如果
a[left] + a[right] < sum
- 说明
a[right]
过小。因此需要将left++
- 说明
- 如果
a[left] + a[right] == sum
- 说明满足条件。计算乘积。将答案进行一个简单保存,依次执行完循环从而计算出最优解。
- 最后将
right--;left++
- 如果
AC代码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
int left = 0;
int right = array.length - 1;
int mul = Integer.MAX_VALUE;
int x = left;
int y = right;
int flag = 0;
while(left < right) {
int tmp = array[left] + array[right];
if(tmp > sum) {
right--;
}else if(tmp < sum) {
left++;
}else if(tmp == sum){
if(array[left] * array[right] <= mul) {
mul = array[left] * array[right];
flag = 1;
x = left;
y = right;
}
left++;
right--;
}
}
if(flag == 0){
return list;
}
list.add(array[x]);
list.add(array[y]);
return list;
}
}