题目
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
最容易想到的思路是,两层遍历,暴力求解。另一种思路是利用首尾指针逐次往中间逼近,知道找到第一个满足条件的S,其实这个S也就是那个乘积最小的S,用数学可以证明,排序队列里,越靠近中间的两个数的乘积越大。
代码
function FindNumbersWithSum(arr, sum) {
if (arr.length === 1) return []
let res = []
let start = 0
let end = arr.length - 1
while (start < end) {
if (arr[start] + arr[end] > sum) {
end--
} else if (arr[start] + arr[end] < sum) {
start++
} else {
res.push([arr[start], arr[end]])
return res
}
}
return res
}
网友评论