输入一个递增排序的数组和一个数字S
,在数组中查找两个数,使得他们的和正好是S
,如果有多对数字的和等于S
,输出两个数的乘积最小的。
数组中可能有多对符合条件的结果,而且要求输出乘积最小的,说明要分布在两侧 比如
3,8
5,7
要取3,8
。
由于题目中已经说明了数组是递增排序的数组,所以定义两个指针一左一右,不断逼近结果,最后取得最终值。
- 定义一个小索引
left
, 从0
开始; - 定义一个大索引
right
从array.length - 1
开始; - 判断两个数的值相加是否等于
s
; - 若是小于
s
,则左指针向右移; - 若是大于
s
,则右指针向左移动; - 终止条件为
left ===right
.
function findNumbersWithSum(array, sum) {
if (array && array.length > 0) {
let left = 0,
right = array.length - 1;
while (left < right) {
const total = array[left] + array[right] // 计算当前两个指针的合
if (total > sum) {
right--;
} else if (total < sum) {
left++;
} else {
return array[left] * array[right]
}
}
}
return 0
}
测试代码
console.log(findNumbersWithSum([3, 5, 7, 8]))
// 24