算法:给一个数组,找出其中和为n的两个元素

21 阅读1分钟
  • 有一个递增的数组[1,2,4,7,11,15] 和一个n=15
  • 数组中有两个数,和是n。即4+11===15
  • 写一个JS函数,找出这两个数

常规思路

  • 嵌套循环,找到一个数,然后去遍历下一个数,求和,判断
  • 时间复杂度为O(n^2),不可用

优化 - 利用递增(有序)的特性

  • 随便找两个数
  • 如果和大于n,则需要向前寻找
  • 如果和小于n,则需要向后寻找 --- 二分法

image.png

双指针,时间复杂度降低到O(n)

  • 如果i指向头,j指向尾,求arr[i]+arr[j]
  • 如果大于n,则j需要向前移动
  • 如果小于n,则i需要向后移动
function findTwoNumbers(arr: number[], n: number): number[] {
  let res: number[] = []
  let length = arr.length
  if (length === 0) return res
  let i = 0
  let j = length - 1
  while (i < j) {
    if ((arr[i] + arr[j]) < n) {
      i++
    } else if ((arr[i] + arr[j]) > n) {
      j--
    } else {
      res.push(arr[i])
      res.push(arr[j])
      break
    }
  }
  return res
}

// 功能测试
const ar2: number[] = [1, 2, 4, 7, 11, 15]
const n = 15
console.log(findTwoNumbers(ar2, n))

结果:

image.png

划重点

  • 时间复杂度达到O(n^2),是不可用的算法
  • 凡有序,必二分
  • 优化嵌套循环,可以考虑“双指针”