题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
两个指针,一个在数组开头,一个在结尾。
当两值和与sum相同时,申请一个数组,保存这两个值以及两值的积。并存储在另一个数组中。
最后得到乘积最小的那个数组,并把第三个数删除即可。这都是技巧而已,无所谓。
主要是前后两个指针的来回移动。
import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<ArrayList<Integer>> list = new ArrayList();
int low = 0,high = array.length - 1;
while(low < high){
int value = array[low] + array[high];
if(value < sum){
low++;
}
else if(value > sum)
high--;
else{
ArrayList<Integer> list1 = new ArrayList();
list1.add(array[low]);
list1.add(array[high]);
list1.add(array[low] * array[high]);
list.add(list1);
low++;
}
}
if(list.size() == 0)
return new ArrayList();
int min = list.get(0).get(2);
int index = 0;
for(int i=1;i<list.size();i++){
int val = list.get(i).get(2);
if(min > val){
min = val;
index = i;
}
}
list.get(index).remove(2);
return list.get(index);
}
}
固定第一个数,查看sum减去这个数是否在这个数组里面!
import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> arr = new ArrayList();
HashSet<Integer> set = new HashSet();
int value = 0;
boolean first = true;
for(int i=0;i<array.length;i++)
set.add(array[i]);
for(int i=0;i<array.length;i++){
int a = array[i];
int b = sum - a;
if(set.contains(b)){
if(first){
arr.add((a < b) ? a : b);
arr.add((a > b) ? a : b);
value = a * b;
first = false;
}else{
if(a * b < value){
arr = new ArrayList();
arr.add((a < b) ? a : b);
arr.add((a > b) ? a : b);
value = a * b;
}
}
}
}
return arr;
}
}