「前端每日一问(56)」请实现一个二分查找

355 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

本题难度:⭐ ⭐

本题类型:算法、手写

阿林最近忙爆了,真的没时间认真写文章了,但是再忙也不能忘了学习,不然就懈怠了,最近多更新点前端面试中出现的高频算法题吧。

哪怕每天只学习半小时,也有收获,绝对不能懈怠!

题目描述

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

原题地址:leetcode704. 二分查找

题目要求

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

题目分析

这道题实在太经典了,算法入门必刷题之一。

二分法是为了解决线性查找太慢而发明的算法,可以把查找的时间复杂度从 O(n) 降为 O(logn)。

本题思路:

  • 定义左右指针 left 和 right
  • 找出中间位置,并判断该位置值是否等于 target
    • 中间位置的值和target相等, 则返回中间位置下标
    • 中间位置的值 < target, 则 left 指针移到中间
    • 中间位置的值 > target, 则 right 指针移到中间

图解:

二分.jpeg

图片来源,侵删。

编码实现

function search (nums, target) {
  let left = 0
  let right = nums.length - 1
  while(left <= right) {
    let mid = (left + right) >> 1 // 找中间值可以用位运算,代码更简洁
    if (nums[mid] === target) {
      return mid
    } else if (nums[mid] > target) {
      right = mid - 1
    } else {
      left = mid + 1
    }
  }
  return -1
}

运行结果

vscode leetcode 插件 yyds! 上班“认真工作”的神器 🐶

image.png

结尾

阿林水平有限,文中如果有错误或表达不当的地方,非常欢迎在评论区指出,感谢~

如果我的文章对你有帮助,你的👍就是对我的最大支持^_^

我是阿林,输出洞见技术,再会!

上一篇:

「前端每日一问(55)」检查字符串是否是有效的括号

下一篇:

「前端每日一问(57)」两数之和