题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
思路
两个变量small与large分别记录两个结果数字中的最大值与最小值,一个布尔型变量find(初始化为false)记录是否可以找到。
两个指针ahead,behind分别指向数组的前后两端。
当ahead<behind时候,进行判断:
- 若两个指针所值的值和为sum且乘积小于mul(初始化为Integer.MAX_VALUE),更新small与large,find为真,后面的指针behind前移,前面的指针ahead后移,进入下一次的比较;
- 若两个指针所值的值大于为sum,需要将后面的指针behind前移(和变小有可能结果为sum),进入下一次的比较;
- 若两个指针所值的值小于为sum,需要将前面的指针ahead后移(和变大有可能结果为sum),进入下一次的比较。
循环结束后若没有找到(find=false),则返回空,否则返回small与large。
java实现
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
int len = array.length;
ArrayList<Integer> result = new ArrayList<Integer>();
if (array == null ||len == 0 )
return result;
int ahead = 0;
int behind = len - 1;
int small = 0;
int large = 0;
int mul = Integer.MAX_VALUE;
boolean find = false;
while (ahead < behind) {
if (array[ahead] + array[behind] == sum && array[ahead] * array[behind] < mul) {
small = array[ahead];
large = array[behind];
behind--;
ahead++;
mul = small * large;
find = true;
} else if (array[ahead] + array[behind] > sum)
behind--;
else
ahead++;
}
if (!find)
return result;
result.add(small);
result.add(large);
return result;
}
}