15.和为S的两个数字

题目

输入一个递增排序的数组和一个数字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
}

你可能感兴趣的:(15.和为S的两个数字)