Leetcode刷题笔记:二分查找算法

[Leetcode] 二分查找算法指南(基础篇) 前言 二分查找算法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,具有很大的应用场景,而在 LeetCode 中,要运用二分搜索法来解的题目也有很多,但是实际上二分查找法的查找目标有很多种,而且在细节写法也有一些变化。 问题形式 二分查找算法充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用 O(logN)O(logN)O(logN) 完成搜索任务。 题... 阅读详情

题目:二分查找

折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用 O(log n) 完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列且不重复)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如果x < a [n/2],则我们只要在数组a的左半部继续搜索x;如果x > a[n/2],则我们只要在数组a的右 半部继续搜索 x。

通俗讲,就是在有序数组中,寻找一个目标值的步骤为:定好左右边界值下标 left 与 right ,从而确定中间值下标,进而从中间开始排除目标值是否存在于数组中,最后在确认左右区间是否存在目标值,不断循环直至找到目标值或结束循环。

LeetCode题目链接

题目描述

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

测试用例

示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示

  • 你可以假设 nums 中的所有元素是不重复的。
  • n 将在 [1, 10000]之间。
  • nums 的每个元素都将在 [-9999, 9999]之间。

这类型数组为有序数组并且为升序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件。

注意:无序数组无法使用二分法、降序与升序数组大小关系相反,中间索引值注意内存溢出。

为什么中间值取值需要注意存在内存溢出呢?

如果存在左边界值 int left ,右边界值 int right ,取它们的中间值,第一时间想到的就是 (left+right)/2 ,而这就将发生内存溢出,由于 int 数据类型存在最大最小值,假设,right值等于最大值,left+right 的值就大于 int 的最大值,发生内存溢出。
解决方案:使用 left+((right-left)/2),将每个过程所得值都限制在最大值内。

right-left = 数组长度 < maxInt
(right-left)/2 = middle长度 < maxInt
left<left+((right-left)/2) < right < maxInt
left+((right-left)/2) < right < maxInt

不再出现内存溢出。

二分法的两种做法

二分法就区间的取法可分为两种做法:

  • 左闭右开,即 [left,right)
    每次循环条件为 left< right ,当 nums[middle] > target 时,迭代体为 right = middle,反之,left = middle+1。
  • 左右全闭,即 [left,right]
    每次循环条件为 left<= right ,当 nums[middle] > target 时,迭代体为 right = middle-1,反之,left = middle+1。

此处所提到的左右全闭与左闭右开是边界值下标 left 与 right 相对于目标值 target 而言的取值区间。
对于这两种做法,由于区间不同,着重认识每次循环后,right 的取值问题之间的区别,即边界问题的处理方法。

Java 程序代码

对于本题如若还需其他语言版本的解题代码,请参照代码随想录中的相关内容,链接已放置文末。

边界逻辑代码模板

不能拘泥于模板的使用,否则,可能存在不合时宜地题目优化问题,甚至解决不了问题,学会根据题目需求灵活解决问题才是王道。

  • 左右全闭
class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while(left <= right) { 
            int mid = (left + right) / 2;
            if(nums[mid] == target) { 
                // 相关逻辑
            } else if(nums[mid] < target) {
                left = mid + 1; 
            } else {
                right = mid - 1; 
            }
        }
        // 相关返回值
        return 0;
    }
}
  • 左闭右开
class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length; 
        while(left < right) { 
            int mid = (left + right) / 2; 
            if(nums[mid] == target) {
                // 相关逻辑
            } else if(nums[mid] < target) {
                left = mid + 1; 
            } else {
                right = mid; 
            }
        }
        // 相关返回值
        return 0;
    }
}

解题代码
  • 左右全闭
class Solution {
    public int search(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        
        if(nums[left]>target | nums[right]<target){
            return -1;
        }
        else{
            while(left<=right){
                int middle=left+((right-left)/2);
                if(nums[middle]<target){
                    left=middle+1;
                }
                else if(nums[middle]>target){
                    right=middle-1;
                }
                else{ 
                    return middle;
                }
            }
        }
        return -1;
    }
}
  • 左闭右开
class Solution {
    public int search(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        if(nums[left]>target | nums[right]<target){
            return -1;
        }
        else{
            while(left<right){
                int middle=left+((right-left)/2);
                if(nums[middle]<target){
                    left=middle+1;
                }
                else if(nums[middle]>target){
                    right=middle;
                }
                else{ 
                    return middle;
                }
            }
        }
        return -1;
    }
}

相关链接

相关其他题目 (LeetCode 链接)
参考文章

求点赞转发

2021 字节跳动面试总监首发 1121 道 LeetCode 算法刷题笔记(含答案) 关于算法刷题的困惑和疑问也经常听朋友们提及。这份笔记里面共包含作者刷 LeetCode 算法题后整理的数百道题,每道题均附有详细题解过程。很多人表示刷数据结构和算法题效率不高,甚是痛苦。有了这个笔记的总结,对校招和社招的算法刷题帮助之大不言而喻,果断收藏了。 非常值得一刷的 LeetCode LeetCode 刷题目录 思维导图 其次,我们看一下内容: 内容涵盖 15 大章节:综述,数组,简单排序,栈和队列,链表,递归,高级排序,二叉树,红-黑树,2-3-4 树和外部存储,哈希... 阅读详情

相关推荐

真的神了~无意中发现1500道的2021LeetCode算法刷题pdf笔记

昨晚逛GitHub,无意中看到一位大佬的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到。 关于算法刷题的困惑和疑问也经常听朋友们提及。这份笔记里面共包含作者刷力扣算法题后整理的上千道题,每道题均附有详细题解过程。有了这个笔记的总结,对校招和社招的算法刷题帮助之大不言而喻,果断收藏安利。 累计1500+道...拿来即刷!word很大,你忍一下,我就不一一截图了,诸君自行下载哈。 可以看到,每道题的原题,题目大意,解题思路,以及代码实现都非常

Java高级面试 4891

leetcode-二分查找

704.Binary Search (1) Binary Search - LeetCode 迭代方式 int search(vector<int>& nums, int target) { int lo = 0; int hi = nums.size()-1; while(lo<=hi){ int mid = (lo+hi)/2; if(nums[mid] .

RyannchenOO的博客 1025

Leetcode-How-What 力扣Leetcode刷题指南

Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the interview and the solutions to some Leetcode problems’. 怎样为准备面试机智聪明的刷题(高效刷题)以及一些题目的题解。 同 github 链接: https:/...

edwardwjz的博客 4528

算法入门之二分法(LeetCode)

算法入门之二分法 LeetCode前言1.原理2. 模板2.1模板内容2.2 模板区别与分析3.案例分析4. 相关链接 前言 现实生活中,从大量的数据中查找一个特定的信息是一个常见的生活问题,比如google一个未知的一个事物。基于这样的生活问题,也产生了很多搜索算法,例如顺序查找法,二分法等等。针对特定的问题我们需要选用合适的算法来大大减少搜索的时间。本博客将简单介绍一下针对有序数据的二分查找算法的原理和实现方法。 1.原理 二分法又叫折半查找法,可以简单理解为:在一堆有序数据中每一次查找根据条件取掉一半

weixin_44530917的博客 2887

1024,给大家谈谈如何搞透刷题 玩转力扣!

前言 大家好,我是bigsai,好久不见!今天1024,祝大家程序员节快乐,写代码永没bug!今天就给各位小伙伴分享我自己刷题力扣的一些小方法,不一定很有用但是可以参考,祝你更高效的变强! 最近在一些群聊、私聊中遇到很多的一个问题就是:刷题,大家也都重视到算法刷题对冲击大厂的重要性,越来越多的人开始卷起来了! 但有的人是这样卷起来的,卷的自己都懵了。 今天,我就给偏初学者的各种问题谈谈个人刷力扣这方面的观点。 刷哪些题? 大家刷力扣,目标肯定就是为了冲击大厂的面试笔试,小部分就是为了坚持刷题保持感觉提升

bigsai 4293

Prometheus-2.53.1安装

Prometheus+Grafana安装

qlj062127的博客 1788

Leetcode之二分查找

向后看一眼对于这种情况,当我们通过二分查找,找到第一个等于target的元素的时候,需要看一下mid右边的值是否也等于target,如果是,则我们需要继续对[mid+1,high]进行二分查找,如果不是,则说明mid就是我们要找的元素。题目链接解题思路参考上面的二分查找的变形,我们可以分别找到第一个大于等于target的下标和最后一个等于target的下标,然后返回这两个下标即可。

古承风的博客 1041

ddr3ip核心_DDR3 IP 核配置

DDR3 控制器 IP 核2.DDR3 IP核配置点击 Flow Navigator 面板下的“Project Manager -->IP Catalog”。 在“Memories & Storage Elements -->Memory Interface Generators”分类展开后,可以看到名为“Memory Interface Generator (MIG 7 ...

weixin_33049919的博客 2935

【LeetCode刷题-Java/Python】二分查找

二分查找

Magnolia_He的博客 1343

基于STM32的智能循迹小车设计(基础版)

基于STM32的智能循迹小车设计 硬件准备 1、小车底盘+四直流电机(带轮) 2、STM32F103C8T6核心板 3、12V 8700mAh锂电池(可以用几节18650锂电池) 4、循迹模块 选择的是TCRT500L,五路集成在一起,集成度比较高,但是可能不如五个单独的循迹模块好用 5、L298N电机驱动模块 四驱车为啥用L298N电机驱动模块? 可以把左边的两个电机并联,用输出A控制。把右边的两个电机并联,用输出B控制。 12V供电接电源正极,供电GND接电源负极和核心板GND,5V供电接核心

Rendezvous1的博客 3万+

Unity中5自由度机械臂运动控制与夹爪交互仿真实践

本文详细介绍了在Unity中实现5自由度机械臂运动控制与夹爪交互仿真的完整流程。从模型导入、物理组件配置到关节运动控制算法(包括逆运动学IK),再到夹爪抓取逻辑和工业分拣案例实战,提供了可落地的代码示例与性能优化方案,助力开发者快速掌握机械臂仿真核心技术。

weixin_29021757的博客 446

【力扣刷题笔记第二期】Python 数据结构与算法

双指针三种技巧:快慢指针、左右指针、滑动窗口

许虹蕾的博客 808

Docker部署OnlyOffice踩坑实录:解决editor.bin下载失败的3种姿势

本文详细解析了Docker部署OnlyOffice时editor.bin下载失败的常见原因,并提供了三种核心解决方案。重点剖析了容器网络配置、Nginx反向代理(特别是proxy_pass设置)以及安全策略调整,帮助开发者彻底解决静态资源加载问题,确保文档协作平台稳定运行。

weixin_29281941的博客 873

Leetcode刷题笔记

`vector` | 否 | `std::lower_bound(begin, end, value)` || `set`/`map` | 是 | `container.lower_bound(value)` |在 C++ 中,vector 本身没有 lower_bound 方法,但可以通过标准库的泛型算法 std::lower_bound 来实现同样的功能。

weixin_45746058的博客 130

把 ABAP writable CDS view entity 讲透:从只读建模到可写模型的 ABAP CDS 新能力

摘要:SAP引入的writable CDS view entity突破了传统CDS视图只读的限制,允许通过ABAP SQL直接进行数据修改。该特性通过WRITABLE关键字定义,使CDS视图成为与数据库表同等级别的可写对象。其核心价值在于为数据集成、中间层同步等场景提供结构化写入入口,但需注意不应绕过业务规则。最佳实践建议保持底层表结构简单映射,避免复杂变形。这一特性标志着CDS从单纯消费模型向双向数据交互能力的演进,为ABAP开发提供了新的数据边界设计思路。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1313

【深度学习新浪潮】李飞飞团队VAGEN框架深度解析:让VLM智能体学会“三思而后行“

VAGEN框架的真正价值,不仅在于性能指标的突破,更在于重新定义了VLM智能体的发展方向——人工智能的进步不应只追求"做得对",更要实现"想得清"。李飞飞团队通过强制显式思考、动态表示适配和精细化奖励三大创新,让智能体第一次具备了可解释的世界建模能力。正如人类通过"观察-预测-行动"认识世界,VAGEN为AI注入的这种思考范式,或许正是通往通用人工智能的关键一步。对于开发者而言,开源的VAGEN框架不仅提供了强大的工具,更揭示了一个重要理念:让AI学会思考,比让它学会执行更重要。

专注:太空算力、AI infra、异构调度、大模型成本工程 281

Leetcode刷题笔记(C++)——二分查找

Leetcode刷题笔记(C++)——二分查找 整理一下刷题过程中的思路,在这里进行一下总结与分享。 github地址:https://github.com/lvjian0706/Leetcode-solutions github项目是刚刚新建的,陆续会将整理的代码以及思路上传上去,代码是基于C++与python的。同时会将基础的排序算法等也一并进行整理上传。 4. 寻找两个正序数组的中位数 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且

CV小菜鸟的博客 493

从0玩转Mamba神经网络:理论+实战的保姆级教程

Mamba神经网络是一种基于状态空间模型(SSM)的高效序列处理架构,相比Transformer具有更快的推理速度和更低的内存消耗。本文提供从理论到实践的完整指南,详细讲解Mamba的工作原理、与Transformer的差异,并给出基于PyTorch的文本分类实战示例。教程包含环境配置、数据处理、模型搭建、训练评估全流程,展示了Mamba在IMDb情感分析任务中的应用。文章还探讨了Mamba的性能优势及进阶方向,为开发者提供了探索这一新兴技术的实用指南。通过阅读本文,读者可以快速掌握Mamba的核心概念并上

FJN110的博客 316

LeetCode刷题笔记-704.二分查找

LeetCode刷题笔记-704.二分查找

qq_44653420的博客 431

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

力扣(LeetCode)怎么刷题,以排序算法为例

掌握 LeetCode 刷题方法再开始刷题,属于磨刀不误砍柴工。掌握正确方法是非常重要的。 如果你在刷题的时候发现怎么也写不出来,别担心,这是正常的。如果你还发现,之前明明刷过的题,过段时间再做的时候,自己还是不会。别担心,这也是正常的。 在这我分享一下我的刷题经验,希望对你有帮助。如果你时间比较紧迫,为了找工作而刷题,我建议你先刷热门推荐,一共两百多道题。 在 LeetCode中文版 页面的右侧。先刷热题 HOT 100,再刷精选 TOP 面试题,之后刷其他的题。 如果你时间比较充裕,那我建议

Allenzyg的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

刷完 900 多道算法题的首次总结:LeetCode 应该怎么刷?

LeetCode 算法题应该怎么刷?算法题学习路线?怎么组队刷题?有没有算法刷题群? 你是怎么入门 LeetCode 的?刷完 1000 道算法题是什么体验?大家都是怎么刷题的? 新手小白开始刷算法题应该怎么刷,注意什么?刷 LeetCode 总是觉得太难怎么办? 刷算法题有没有书籍推荐?该按照什么顺序刷算法题?LeetCode 怎么看别人的题解?有哪些好的算法题博主推荐?

负雪明烛 13万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

力扣刷题之准备工作

在刷算法题的过程中进行总结是非常重要的,它可以帮助你梳理思路、加深理解、记录学习成果,并提升解题能力。每天回顾:在每天结束时,对当天解决的题目进行回顾。检查解决方案的正确性,并思考是否有更优化的方法。记录下遇到的难点和解决方法,以及学到的新知识点和技巧。整理这些笔记并归档到适当的分类中,以便今后参考。每周汇总:在每周末或开始新一周时进行总结。复习过去一周解决的题目,分析解题过程中使用的算法和数据结构。总结你学到的关键知识点、解题技巧和模式,并将其整理到博客中。

weixin_47040031的博客 9756

LeetCode刷题顺序

简介 是不是有许多小伙伴在刷力扣的时候感觉无从下手?从头按顺序开始刷的童鞋们可能会比较有感触,为什么才第四题就感觉很难了?没关系,本文将对力扣的 1-700 题中不需要会员的数据结构与算法题目(数据库与 shell 除外)进行分类,并推荐一个刷题的顺序。 完全零基础可以刷题吗? 不能,至少要基本掌握一门计算机语言的语法。但现在在网上随便搜一下就能搜到许多关于计算机语言的教程。当然,最好还是上一下正规的课程。 刷题顺序很重要吗? 重要。按照题目类别结构化地刷题的速度不仅更快,而且可以在刷完一类题之后进行总

qq_42548880的博客 8909

看完谷歌大佬的刷题笔记, 我直接手撕了101道 Leetcode 算法题

有了这份笔记,再也不愁搞不定 Leetcode

沉默王二 1万+

LeetCode刷题指南

力扣,作为一个国内外的程序员都用作准备面试的刷题网站,对想要阅读这篇指南的你应该都不陌生。当你想要借助力扣刷题,提升代码能力、在面试中脱颖而出,却不知从何入手,这篇文章可以作为你的入门指南。

airhaohan 的博客 8990

耗时3个月,近10W字的刷题笔记,多语言通吃,秒杀 80% Leetcode 题目!

学会了,offer收割机就是你~

Jack-Cui 1万+
下一篇: LeetCode刷题笔记:二分查找简单进阶
yumuing blog
博客等级 码龄6年 9922粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yumuing blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值