面试题 57. 和为 S 的两个数字

题目一:和为 S 的两个数字

题目

输入一个递增排序的数组和一个数字 S,在数组中查找两个数,是的他们的和正好是 S,如果有多对数字的和等于 S,
输出两个数的乘积最小的。

思路

数列满足递增,设两个头尾两个指针 i 和 j,
若 ai + aj == sum,就是答案(相差越远乘积越小)
若 ai + aj > sum,aj 肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1
若 ai + aj < sum,ai 肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1

Java 实现

import java.util.ArrayList;
public class 和为 S 的数字 {
public static ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(array==null||array.length<2){
return list;
}
int i = 0,j = array.length-1;
while(i<j){
if(array[i]+array[j]==sum){
list.add(array[i]);
list.add(array[j]);
//return list; //如果只输出乘积最小的,就在这里 return list;即可
i++;
j++;
}else if(array[i]+array[j]>sum){
j--;
}else{
i++;
}
}
return list;
}
public static void main(String[] args) {
int array[] = {1,2,3,4,5,6,7,8,9,10};
int sum = 10;
ArrayList<Integer> list = FindNumbersWithSum(array,sum);
System.out.println(list);
}
}

运行结果

[1, 9, 2, 8, 3, 7, 4, 6]

题目二:和为 S 的连续正数序列

05-23 19:06