题目
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
对应每个测试案例,输出两个数,小的先输出。
思路
数组为递增数组,可以采用双指针,第一个指针指向数组的第一个数字,第二个指针指向数组的最后一个数字,当两数相加大于S时,则最后一个指针前移;小于S时,则第一个指针后移;当两数之和等于S时,则两数乘积必定最小(和一定则差的绝对值越大乘积越小),将这两个数字直接输出。
也可以将符合条件的乘积和数组保存下来,再进行判断。
可变长度数组ArrayList<T>
代码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList <Integer> result = new ArrayList<>();
if (array.length<2)
return result;
//根据数学理论可知和相同,最外层(相距最远)的两个数乘积最小
int i = 0;
int len = array.length;
//int [] temp= new int;
while(i<len){
if(array[i]+array[len-1]==sum){
result.add(array[i]);
result.add(array[len-1]);
break;
}
if(array[i]+array[len-1]<sum){
i++;
}else{
if(array[i]+array[len-1]>sum)
len--;
}
}
return result;
}
}