Leetcode 刷题 704. 二分查找

很多前端的同学对数据结构和算法这块没有太多的概念,很多leetcode的题目看不懂,有时候可能看了题解也不知道是什么意思。下面根据题目来练习一下二分查找

704. 二分查找

题目

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

题解

题目中给我们一个排序 数组和一个目标值,然后找到这个目标值,返回对应的位置,如果没有找到则返回-1。这个我们就可以利用二分查找 来解决那可就很简单了(不清楚二分的可以先去看看二分查找之万变不离其宗)。

示例1

我们先用图来演示下示例1 首先我们需要两个指针:一个左边指针(开始起点)left,也就是数组的第一个索引"0".一个右边指针(结束索引)right,也就是数组的最后一个索引nums.length - 1。同时我们还需要一个中间点mid.

可以发现,mid是处在索引为2的地方,这是为什么呢?因为leftright的索引的一半是2.5没有对应的索引,所以可以通过Math.floor解决这个问题。然后我们在通过mid对应的值和target的值进行对比。

  • 如果mid对应的值和target对应的值相等,说明找到了,则直接返回即可
  • 如果mid对应的值小于target对应的值,说明target的值在(mid, right]这个区间内,则将left直接移动到mid的下一位
  • 如果mid对应的值大于target对应的值,说明target的值在[left, mid)这个区间内,则将right直接移动到mid的上一位

比如我们的这个案例中,target是9,mid对应的是3,所以需要改变left的位置。我们通过图来看下完整的过程

mid对应的值是9,和target一样的时候,则直接返回。

那如果没有找到呢?我们来看下示例2

示例2

示例2中target变成了2.我们再来看下图

mid对应的值为3时,比target大,所以需要改变right的位置.right的位置确认后,我们就可以确认mid的位置,此时它和left的对应的值是一样的,比target小,所以需要改变left的位置。

根据同样的步骤走完之后,此时left,right,mid,在同一个位置,但是还是没有找到target的值,而且mid对应的值比target小,,所以需要改变left的位置。这样的话,left就大于right了,那就不可能找到了,则return -1

完整代码

js 复制代码
var search = function (nums, target) {
  let left = 0;
  let right = nums.length - 1;
  while (left <= right) {
    const mid = Math.floor(left + (right - left) / 2);
    if (nums[mid] === target) {
      return mid;
    } else if (nums[mid] > target) {
      right = mid - 1;
    } else if (nums[mid] < target) {
      left = mid + 1;
    }
  }
  return -1;
};

欢迎大家点赞评论,大家一起学习一起进步!!!

相关推荐
星空寻流年18 分钟前
CSS3(BFC)
前端·microsoft·css3
九月TTS19 分钟前
开源分享:TTS-Web-Vue系列:Vue3实现固定顶部与吸顶模式组件
前端·vue.js·开源
CodeCraft Studio39 分钟前
数据透视表控件DHTMLX Pivot v2.1发布,新增HTML 模板、增强样式等多个功能
前端·javascript·ui·甘特图
一把年纪学编程41 分钟前
【牛马技巧】word统计每一段的字数接近“字数统计”
前端·数据库·word
llc的足迹1 小时前
el-menu 折叠后小箭头不会消失
前端·javascript·vue.js
?abc!1 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存
BioRunYiXue1 小时前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学
九月TTS1 小时前
TTS-Web-Vue系列:移动端侧边栏与响应式布局深度优化
前端·javascript·vue.js
Johnstons1 小时前
AnaTraf:深度解析网络性能分析(NPM)
前端·网络·安全·web安全·npm·网络流量监控·网络流量分析
whatever who cares2 小时前
CSS3 伪元素(Pseudo-elements)大全
前端·css·css3