写在前面:
有了上一篇文章的基础(链接:http://blog.csdn.net/may_3/article/details/79357223),我们再来看这道题目就会简单很多。同样是要设置两个指针start记录两个数中较小数的索引,和end记录两个数中较大数的索引。
(1)array[start]+array[end]==sum时,保存到list中。
(2)array[start]+array[end]>sum时,说明右侧的数要向左侧逼近,所以end--。
(3)array[start]+array[end]==sum时,说明左侧的数要向右侧逼近,所以start++。
注意:这道题要求输出乘积最小的一组,所以我们从最外侧的两个数,开始逼近,就可以保证,乘积最小的原则。
代码实现:
package test7;
import java.util.ArrayList;
public class Solution2 {
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
// 因为先输出乘积最小的,所以从两边开始,慢慢逼近
ArrayList<Integer> list = new ArrayList<Integer>();
if (array.length < 2) {
return list;
}
int start = 0;// 记录两个数中较小的数的索引
int end = array.length - 1;// 记录两个数中较大的数的索引
while (start < end) {
if (array[start] + array[end] == sum) {
list.add(array[start]);
list.add(array[end]);
break; // 如果找到了就结束循环
}
if (array[start] + array[end] > sum) {
end--;
}
if (array[start] + array[end] < sum) {
start++;
}
}
return list;
}
}