1、题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
2、思想
方法一:笨方法,时间复杂度O(n^2)
固定一个数字,分别判断该数字和后面的数字和是否等于S。
方法二:好方法,时间复杂度O(n)
定义两个指针,第一个指针指向数组的第一个数字(最小的),第二个指针指向数组的最后一个数字(最大的),如果两个数字的和大于s,则将第二个指针向前移动,否则将第一个指针向前移动。如果两个指针指向同一个数字还没有找到,则说明不存在两个数的和正好为s。将乘积小的两个数替换arraylist中乘积大的两个数。
3、代码实现(方法二实现)
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(array.length <= 0){
return list;
}
int first = 0;
int last = array.length-1;
while(first < last){
int s = array[first] + array[last];
if(s > sum){
last--;
}else if(s < sum){
first++;
}else{
if(list.size() > 0){
if(array[first]*array[last] < list.get(0)*list.get(1)){
list.set(0,array[first]);
list.set(1,array[last]);
}
}else{
list.add(array[first]);
list.add(array[last]);
}
first++;
last--;
}
}
return list;
}
}