当前位置: 首页 > news >正文

可视化图解算法40:二分查找-I

1. 题目

描述

请实现无重复数字的升序数组的二分查找

给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1

数据范围:0≤len(nums)≤2×105 , 数组中任意值满足val∣≤109

进阶:时间复杂度 O(logn) ,空间复杂度O(1)

示例1

输入:

[-1,0,3,4,6,10,13,14],13

返回值:

6

说明:

13 出现在nums中并且下标为 6    

示例2

输入:

[],3

返回值:

-1

说明:

nums为空,返回-1    

示例3

输入:

[-1,0,3,4,6,10,13,14],2

返回值:

-1

说明:

2 不存在nums中因此返回 -1  

2. 解题思路

先来看一下什么是二分查找?

二分查找是一种高效的搜索算法,适用于有序数组。其核心思想是通过不断缩小搜索范围,将时间复杂度降至 O(log n)

核心步骤:

  1. 初始化指针:设置左指针 left = 0,右指针 right = 数组长度 - 1。

  2. 循环查找:当 left <= right 时,重复以下步骤: 计算中间索引 mid = left + (right - left) // 2(避免整数溢出)。 比较中间元素 arr[mid] 与目标值 target: 若相等,返回 mid。 若 arr[mid] < target,说明目标在右侧,更新 left = mid + 1。 若 arr[mid] > target,说明目标在左侧,更新 right = mid - 1。

  3. 未找到:若循环结束未找到,返回 -1。

假如要查找的有序数组、查找元素如下图所示:

定义两个变量left、right,分别指向数组的第0个位置和最后一个位置。这两个变量组成的区间为:[0,n-1]。通过循环缩小数组区间,查找对应的元素,具体操作如下:

关键点

  1. 初始区间:通常使用左闭右闭区间 [left, right],即 left = 0right = len(nums) - 1

  2. 循环条件while left <= right,确保所有元素被检查。

  3. 中间位置计算mid = (left + right) // 2mid = left + (right - left) // 2(避免溢出)。

  4. 边界更新

    • 找到目标时,标准二分查找直接返回。

    • 寻找左边界时,中间元素 Arr[mid]>= target 则移动右边界。

    • 寻找右边界时,中间元素 Arr[mid] <= target 则移动左边界。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

  • Python版本:数据结构笔试面试算法-Python语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Python语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1372586

  • Java版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1367842

  • Golang版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364840

3. 编码实现

核心代码如下:

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param nums int整型一维数组* @param target int整型* @return int整型*/
func search(nums []int, target int) int {// write code here// 1. 定义变量left := 0right := len(nums) - 1// 2. 通过循环缩小查询区间for left <= right {// 2.1 计算中间位置(数组下标)mid := (left + right) / 2// 2.2 与目标值比较,缩小区间if nums[mid] == target {return mid //中间位置对应的值 等于 目标值,找到,直接返回} else if nums[mid] < target {left = mid + 1 //中间位置对应的值 小于 目标值,则到右侧区间查找(缩小区间:[mid+1,n])} else {right = mid - 1 //中间位置对应的值 大于 目标值,则到左侧区间查找(缩小区间:[0,mid-1])}}return -1
}

具体完整代码你可以参考下面视频的详细讲解。

  • Python版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1372586

  • Java版本:数据结构笔试面试算法-Java语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Java语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1367842

  • Golang版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364840

4.小结

二分查找的关键是要明确使用的前提条件及步骤。前提条件:在有序数组中查找元素。二分查找的步骤:①初始化指针:设置左指针 left = 0,右指针 right = 数组长度 - 1;②循环查找:当 left <= right 时,重复步骤;③未找到:若循环结束未找到,返回 -1。

《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:

        ✅  链表

        ✅  二叉树

        ✅  二分查找、排序

        ✅  堆、栈、队列

        ✅  回溯算法

        ✅  哈希算法

        ✅  动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

  • Python编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ss897667807

  • Java编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ss161443488

  • Golang编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ss63997

对于数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:身无彩凤双飞翼,心有灵犀一点通。

http://www.xdnf.cn/news/471205.html

相关文章:

  • HGDB企业版迁移到HGDB安全版
  • fakeroot 在没有超级用户权限的情况下模拟文件系统的超级用户行为
  • 疲劳分析后处理参数意义?
  • LeetCode 2900.最长相邻不相等子序列 I:阅读理解题——O(n)一次遍历(贪心)
  • Makefile 详解
  • Vscode 配置python调试环境
  • QT——概述
  • 6.重建大师空三介绍
  • AI大模型:(二)2.5 人类对齐训练自己的模型
  • 低损耗高效能100G O Band DWDM 10km光模块 | 支持密集波分复用
  • 致远OA周报日报管理应用包【附百度网盘下载链接,官方售价8K】
  • Qt中控件的Viewport作用
  • 上线前测试组发现问题较多。开发总结
  • 《Python星球日记》 第80天:目标检测(YOLO、Mask R-CNN)
  • WordPress_Relevanssi Sql注入漏洞复现(CVE-2025-4396)
  • 用 Python 实现系统监控与资源管理:深入解析 `psutil` 库
  • HGDB插入超长字段报错指示列名的问题处理
  • C++核心编程--2 引用
  • 5月15日星期四今日早报简报微语报早读
  • IEEE出版|连续多年稳定检索|第三届信号处理与智能计算国际学术会议(SPIC2025)
  • 开源模型应用落地-模型上下文协议(MCP)-Resources-资源的使用逻辑
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月15日第78弹
  • ubuntu系统 usb网卡rtl8852bu驱动安装
  • CSS- 1.1 css选择器
  • LeetCode 235. 二叉搜索树的最近公共祖先 LeetCode 701.二叉搜索树中的插入操作 LeetCode 450.删除二叉搜索树中的节点
  • C++核心编程--1 内存分区模型
  • QT6 源(99)篇三,行输入框QLineEdit:信号与槽函数的学习与举例,以及附上源码
  • vue3:十三、分类管理-表格--行内按钮---行删除、批量删除实现功能实现
  • 多智能体Multi-Agent应用实战与原理分析
  • 车载诊断进阶篇 --- 车载诊断概念