题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述
对应每个测试案例,输出两个数,小的先输出。
AC代码
import java.util.ArrayList;
import java.util.Collections;
//时间复杂度为n2的暴力做法
public class Solution {
ArrayList<Integer> list=new ArrayList<>();
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
for(int i=0;i<array.length;i++){
for(int j=0;j<i;j++){
if(array[i]+array[j]==sum)
{
if(!list.isEmpty()){
int a=array[i]*array[j];
int b=list.get(0)*list.get(1);
//比较乘积
if(a<b)
{
list.remove(0);
//list删除掉index为0的元素后,list的长度会变
//因此第二次remove仍然是index为0的元素
list.remove(0);
}
}
list.add(array[i]);
list.add(array[j]);
//对ArrayList中的两个元素进行排序
Collections.sort(list);
}
}
}
return list;
}
}
数组递增的条件下,符合两数之和为sum的两个数,在距离越远的情况下乘积越小。所以两个数分别从左右两侧开始找。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> res=new ArrayList<>();
if(array==null||array.length==0)
return res;
int l=0,r=array.length-1;
int cnt=0;
while(l<r){
cnt=array[l]+array[r];
if(sum==cnt){
res.add(array[l]);
res.add(array[r]);
return res;
}else if(sum<cnt){
r--;
}else{
l++;
}
}
return res;
}
}