输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:
1.初始化:指针i指向数组首, 指针j指向数组尾部
因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:
-
初始化:指针
left
指向数组首, 指针right
指向数组尾部 -
如果
arr[left] + arr[right] == sum
, 说明是可能解 -
否则如果
arr[left] + arr[right] > sum
, 说明和太大,所以right--
-
否则如果
arr[left] + arr[right] < sum
, 说明和太小,所以left++
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
int len = array.length;
int left = 0;
int right = len-1;
ArrayList<Integer> res = new ArrayList<>(2);
while(left < right){
int s = array[left] + array[right];
if(s == sum){
res.add(array[left]);
res.add(array[right]);
break;
}else if(s < sum){
left++;
}else right--;
}
return res;
}
}
时间复杂度:O(n)
空间复杂度:O(1)