/*
* 面试题57-题目一:和为s的两个数字
* 题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
* 思路:定义两个指针,分别从前面和后面进行遍历。间隔越远乘积越小,所以是最先出现的两个数乘积最小
* 首先在数组中选择两个数字,即两个指针,第一个指针指向数组的第一个数字;第二个指针指向数组的最后一个数字。
* 计算这两个数之和,如果s等于这两个数,就是期待的结果;
* 如果S大于两数之和,则第一个指针向后移动一位;
* 如果s小于两数之和,则第二个指针前移一位
*/
import java.util.ArrayList;
public class No57FindNumbersWithSum {
public static void main(String[] args) {
No57FindNumbersWithSum n = new No57FindNumbersWithSum();
int[] array = {1,2,4,7,11,15};
int sum = 15;
ArrayList<Integer> list = new ArrayList<Integer>();
list = n.FindNumbersWithSum(array, sum);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (array == null || array.length == 0) {
return list;
}
//定义两个指针,分别从前面和后面进行遍历。间隔越远乘积越小,所以是最先出现的两个数乘积最小
int left = 0;
int right = array.length - 1;
while(left < right) {
//计算这两个数之和,如果s等于这两个数,就是期待的结果
int s = array[left] + array[right];
if (s == sum) {
list.add(array[left]);
list.add(array[right]);
return list;
} else if (s > sum) {// 如果s小于两数之和,则第二个指针前移一位
right--;
} else {//如果S大于两数之和,则第一个指针向后移动一位
left++;
}
}
return list;
}
}