题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
解题思路
使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。
如果两个指针指向元素的和 sum == target,那么得到要求的结果;如果 sum > target,移动较大的元素,使 sum 变小一些;如果 sum < target,移动较小的元素,使 sum 变大一些。
既然是排序好的,就好办了:左右加逼
经过推理,可知排序好的数组,找到的第一个和相等的就是乘积最小的。
import java.util.ArrayList;
import java.util.Arrays;//别忘记加
//首尾元素相加,如果之和小于sum,则前一个数向后移动,即i++,否则j--;
public class Solution {
//和为S的两个数字
public ArrayList<Integer> FindNumbersWithSum(int [] array, int sum)
{
ArrayList<Integer>res=new ArrayList<>();
//定义首尾指针,夹逼准则
int i=0;
int j=array.length-1;
while(i<j)
{
int curSum=array[i]+array[j];
if(curSum==sum){
//return new ArrayList<Integer>(Arrays.asList(array[i],array[j]));
res.add(array[i]);
res.add(array[j]);
return res;
}
else if(curSum<sum)//小于的话,就增大最小值,i++
i++;
else
j--;
}
//return new ArrayList<Integer>();
return res;
}
}