IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二分查找问题总结 -> 正文阅读

[数据结构与算法]二分查找问题总结

参考题目

本文参考LeetCode题目如下:

LeetCode 704. 二分查找

LeetCode 35. 搜索插入位置

LeetCode 278. 第一个错误的版本

题目特点

二分查找问题中,题目的共同特点:

  • 题目中规定了有序(升序、降序或按种类排序)数组(或字符串),且数组中元素不重复
  • 题目要求查找某一目标值,该值可能在上述数组中,也可能不在,如在LeetCode 704. 二分查找LeetCode 35. 搜索插入位置中,需要确定目标值应在数组中的位置;而在LeetCode 278. 第一个错误的版本中,数组只有两类,且按类排序的元素,题目要求查找第二类元素中的第一个在数组中的位置

解题思路?

二分查找是一种效率较高的查找方法,主要步骤是比较数组(可看作一个区间)中间元素的值与目标值的关系,进而缩小查找区间的大小,最后可判断目标值在数组中的位置,或是否存在于区间中。具体而言:

1.左右双指针及中值指针

首先设置双指针leftIndexrightIndex,初始leftIndex指向数组起始位置0rightIndex指向数组末端位置array.length - 1,再设置一个指针midIndex 来指示区间中间位置,并且赋值:

midIndex = leftIndex?+ (rightIndex?-?leftIndex?) / 2

注意:不要将midIndex赋值方式变为(rightIndex +?leftIndex) / 2,因为该种赋值方式可能导致溢出。

之后比较array[midIndex]值与目标值的大小(或种类等)关系,如果数组是升序排列的,且目标值比array[midIndex]值大,那么就应该缩减(左)区间大小,所以此时leftIndex应该赋值:

leftIndex =?midIndex + 1

同理可得当目标值比array[midIndex]值小时,rightIndex应该赋值:

rightIndex =?midIndex - 1

注意:在大多数情况下都必须以此种方式(指+ 1- 1操作)进行赋值,否则会导致while循环的循环条件不好写,但有时会出现单边(指leftIndexrightIndex其中之一)进行+ 1- 1操作,例如LeetCode 278. 第一个错误的版本总之+ 1- 1操作是必不可少的。

2.while循环

上述过程需写在循环体中,由于循环次数未知,故使用while循环

针对while循环的写法,循环条件会出现leftIndex <=?rightIndexleftIndex < rightIndex两种情况,需按题意进行具体判断,一般在不确定目标值是否存在于数组中时,写作leftIndex <=?rightIndex,如:LeetCode 704. 二分查找LeetCode 35. 搜索插入位置在确定目标值存在于数组中时,写作leftIndex < rightIndex,如LeetCode 278. 第一个错误的版本

3.返回值

按照题目要求设置返回值即可,一般在while循环中也设置了return返回值,表示在数组中找到了目标值

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:26:57  更:2021-07-22 14:27:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 17:41:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码