前端面试真题,2周刷完100道。 9. 给一个递增的数组,找到两个和为N 的元素

76 阅读1分钟

给一个递增的数组,找到两个和为N 的元素

题目

输入 arr=[1,2,3,4,5,6,11] n=10 输出 [4,6]

思路1

最简单的就是嵌套循环,两个for 循环,来判断和为n, 复杂度为O(n^2), 这个方案不可取

代码实现

function findTwoList (arr: number[], n: number):number[] {
  if (arr.length === 0) return []
  const res:number[] = []
  for(let i=0; i<arr.length; i++) {
    const f = arr[i]
    for (let j =i+1; j<arr.length; j++) {
      const s = arr[j]
      if (f + s === n) {
        res.push(f)
        res.push(s)
        break
      }
    }
  }
  return res
}

思路2 双指针

利用递增有序的特性

  1. 定义两个指针,分别指向数组的开始和结尾
  2. 遍历数组,用首尾相加之和 与 n 做比较,大于n 尾部向头移动, 小于n 头部向尾部移动, 等于n 就返回两个数的数组
  3. 两个指针相同了, 还没有找到对应的值, 返回空数组
  4. 复杂度为O(n)

双指针代码实现

function findTwoList2 (arr:number[], n: number): number[] {
  let res: number[] = []
  let fIndex: number = 0;
  let eIndex: number = arr.length - 1;
  while(fIndex < eIndex && res.length===0) {
    const sum = arr[fIndex] + arr[eIndex]
    if (sum > n) {
      eIndex --
    }else if (sum < n) {
      fIndex ++
    }else {
      res.push(arr[fIndex])
      res.push(arr[eIndex])
    }
  }
  return res
}

2周刷完100道前端优质面试真题 mu课 视频及资料领取请关注:奋斗的刚子