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;
};

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

相关推荐
恋恋风尘hhh15 分钟前
滑动验证码前端安全研究:以顶象(dingxiang-inc)为例
前端·安全
懂懂tty7 小时前
React状态更新流程
前端·react.js
小码哥_常8 小时前
告别繁琐!手把手教你封装超实用Android原生Adapter基类
前端
skywalk81638 小时前
pytest测试的时候这是什么意思?Migrating <class ‘kotti.resources.File‘>
前端·python
房开民8 小时前
可变参数模板
java·开发语言·算法
一只蝉nahc8 小时前
vue使用iframe内嵌unity模型,并且向模型传递信息,接受信息
前端·vue.js·unity
不知名的忻8 小时前
Morris遍历(力扣第99题)
java·算法·leetcode·morris遍历
状元岐9 小时前
C#反射从入门到精通
java·javascript·算法
子兮曰9 小时前
Bun v1.3.12 深度解析:新特性、性能优化与实战指南
前端·typescript·bun
_深海凉_9 小时前
LeetCode热题100-除了自身以外数组的乘积
数据结构·算法·leetcode