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

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

相关推荐
Awu1227几秒前
🍎Vue官方Skills深度解读:那些被悄悄藏起来的宝藏
前端·aigc·claude
YXXY3134 分钟前
模拟算法的介绍
算法
小小前端仔LC7 分钟前
第五篇:前端任务状态管理与实时反馈 (SSE 客户端篇)
前端
LIO25 分钟前
Axios Token 无感刷新机制:原理、实现与最佳实践
前端·axios
happymaker062626 分钟前
简单LRU的实现(基于LinkedHashMap)
算法·leetcode·lru
「已注销」34 分钟前
面试分享:二本靠7轮面试成功拿下大厂P6
前端·javascript·面试
Lee川36 分钟前
深入浅出:用 React 打造高性能懒加载无限滚动组件
前端·react.js
会编程的土豆38 分钟前
【数据结构与算法】空间复杂度从入门到面试:不仅会算,还要会解释
数据结构·c++·算法·面试·职场和发展
普通网友39 分钟前
《算法面试必刷:15 个高频 LeetCode 题(附代码)》
算法·leetcode·面试
_深海凉_41 分钟前
LeetCode热题100-搜索二维矩阵
算法·leetcode·矩阵