题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:对应每个测试案例,输出两个数,小的先输出。
参考思路
这题与和为S的正数序列思路一样,可以使用双指针法。两个指针分别从0与数组最后一个位置开始。并用一个Map来存满足条件的数中较小的那个,方便后续多组数据的比较。因为是有序的,所以这个较小的数不会重复
1、两者和小于目标S,则左指针右移一位
2、两者和大于目标S,则右指针左移一位
3、两者和等于目标S,则记录较小的数存入Map,左指针右移一位。
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> res = new ArrayList<Integer>();
if(array.length == 0)return res;
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
int index1 = 0;
int index2 = array.length-1;
int sumTmp = array[index1] + array[index2];
while(index1 < index2){
if(sumTmp < sum){
index1 ++;
}
else if(sumTmp > sum){
index2 --;
}
else{
map.put(array[index1],array[index1]*array[index2]);
index1++;
}
sumTmp = array[index1] + array[index2];
}
if(map.size() > 0){
int max = Integer.MAX_VALUE;
int key = index1;
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
int value = entry.getValue();
if(value < max){
max = value;
key = entry.getKey();
}
}
res.add(key);
res.add(sum-key);
}
return res;
}
}