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

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

相关推荐
源猿人9 分钟前
企业级文件浏览系统的Vue实现:架构设计与最佳实践
前端·javascript·数据可视化
红红大虾9 分钟前
Defold引擎中关于CollectionProxy的使用
前端·游戏开发
xw51 小时前
uni-app中v-if使用”异常”
前端·uni-app
!win !1 小时前
uni-app中v-if使用”异常”
前端·uni-app
IT_陈寒2 小时前
Java 性能优化:5个被低估的JVM参数让你的应用吞吐量提升50%
前端·人工智能·后端
南囝coding2 小时前
《独立开发者精选工具》第 018 期
前端·后端
小桥风满袖2 小时前
极简三分钟ES6 - ES9中for await of
前端·javascript
半花2 小时前
i18n国际语言化配置
前端
编程贝多芬2 小时前
Promise 的场景和最佳实践
前端·javascript