必刷?704. 二分查找 以及两种变体

Sen+MK趋势分析 阅读详情

二分查找是一个简单但是热门的方法,二分的模板也非常多,这里提供一个简单好记、且不会索引越界的写法,并在此基础上改写得到一些变体,如查找最后一个目标元素,查找第一个大于(或者小于)目标的数。

包含的题目链接:
704. 二分查找:https://leetcode.cn/problems/binary-search/
705. 搜索插入位置:https://leetcode.cn/problems/search-insert-position/
34. 在排序数组中查找元素的第一个和最后一个位置:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/

题目描述

704. 二分查找。给定一个 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

2.非递归二分

二分模板,理解+记忆即可。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if not nums:
            return -1
        left, right = 0, len(nums) - 1
        while left <= right:
            middle = left + (right - left) // 2
            if nums[middle] > target:
                right = middle - 1
            elif nums[middle] < target:
                left = middle + 1
            else:
                return middle
        return -1

3.递归二分

如果非要写个递归版本的,那也只能写一个。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if not nums:
            return -1

        def binary_search(nums, begin, end, target):
            if begin > end:
                return -1
            middle = begin + ((end - begin)>>1)
            if nums[middle] > target:
                return binary_search(nums, begin, middle - 1, target)
            if nums[middle] < target:
                return binary_search(nums, middle + 1, end, target)
            return middle
        
        return binary_search(nums, 0, len(nums) - 1, target)

4.变体1:搜索插入位置

寻找第一个大于target的数,或者是最后一个target,可见35. 搜索插入位置。
在普通的二分上稍作修改即可,当nums[middle] == target时,我们仍然认为没有找到,当作nums[middle] < target处理,这样left指针就会进一步向前,最后一个target一定在left - 1位置(前提是没有越界);如果找第一个大于target的位置,那就是left本身。

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        if not nums:
            return -1
        left, right = 0, len(nums) - 1
        while left <= right:
            middle = left + ((right - left)>>1)
            if nums[middle] <= target:  # 等于也视作小于
                left = middle + 1
            else:
                right = middle - 1
        # target可能在left - 1位置
        if left - 1 >= 0 and nums[left - 1] == target:
            return left - 1

        return left  # 第一个大于target位置

4.变体2:在排序数组中查找元素的第一个和最后一个位置

链接:在排序数组中查找元素的第一个和最后一个位置
其实和变体1没什么区别,只不过现在还要找第一个target或者第一个小于target的位置。和上面一样,nums[middle] == target也认为nums[middle]>target,另right = middle - 1, 在不越界的前提下,第一个target在right + 1位置,第一个小于target在right位置。

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        if not nums:
            return [-1, -1]
        first = self.binary_search(nums, target, pos = 'first')
        last = self.binary_search(nums, target, pos = 'last')
        return [first, last]
        
    def binary_search(self, nums, target, pos='first'):
        begin, end = 0, len(nums) - 1
        while begin <= end:
            middle = begin + (end - begin) // 2
            if pos == 'last':
                if nums[middle] <= target:
                    begin = middle + 1
                else:
                    end = middle - 1
            if pos == 'first':
                if nums[middle] >= target:
                    end = middle - 1
                else:
                    begin = middle + 1
        
        if pos == 'last':
            if begin - 1 >= 0 and nums[begin - 1] == target:
                return begin - 1
            return -1
        if pos == 'first':
            if end + 1 < len(nums) and nums[end + 1] == target:
                return end + 1
            return -1
详解AUTOSAR:AUTOSAR架构中的配置文件(拓展篇—7) 查看AUTOSAR代码包时会发现一些这样格式的文件:xxx_PBcfg.c、xxx_Lcfg.c和xxx_Cfg.h,本篇博文讲一讲这几个配置文件的作用和特点。 阅读详情

相关推荐

LightRAG实战:从零构建中药知识图谱,解锁六种检索模式效能对比

本文详细介绍了如何使用轻量级RAG框架LightRAG从零构建中药知识图谱的实战过程。通过本地部署环境搭建、开源模型配置与《本草纲目》数据导入,文章重点对比了Naive、Local、Global、Hybrid、Mix和Bypass六种检索模式在中药问答中的效能差异,并提供了可视化图谱与优化心得,为开发者构建专业领域智能问答系统提供了实用指南。

weixin_29096377的博客 174

LeetCode704 二分查找

LeetCode704 二分查找题目解题版本一版本二版本三版本四版本五版本六版本七 题目 解题 版本一、二、三:区间为 [left, right],right 初始值为 nums.length - 1。 版本四、五:区间为 [left, right),right 初始值为 nums.length。 二分查找细节详解,顺便赋诗一首 有很多细节分析,如果的各种版本看着很绕,可以先去读读文章。 其实,二分查找不用掌握每个模板,个人是因为看到各种二分查找题解里又相似又不同的写法,彻底看懵了,所以狠了狠心来瞧瞧究竟

343

西门子V90 PN伺服控制核心:FB284功能块详解与实战

在工业自动化中,伺服定位控制是运动控制的基础环节,其本质是PLC通过PROFINET协议与伺服驱动器实现高速、确定性数据交互。FB284作为西门子为V90 PN定制的标准化功能块,封装了GSD映射、状态机管理与周期性PDO同步机制,将底层寄存器操作抽象为高可靠调用接口。相比MOVE指令或MC_MoveAbsolute等通用方案,FB284显著降低时序错乱风险,提升多轴同步精度与故障响应能力。它广泛应用于包装、灌装、装配等中端产线,尤其适配S7-1200/1500平台下的快速部署与现场维护。本文聚焦V90 P

weixin_42696271的博客 298

力扣刷题35,数组——二分查找704相似题

属于简单题,第一次做,感觉题目就是比704多了一小步,但是自己的思路设计复杂了,多加了一个for循环,说明完全没有注意到二分查找的终止条件是什么。二分查找不仅用于查找,还能用于定位某种性质的边界点这类问题是典型的“寻找第一个 ≥ target 的位置”,属于二分查找的一个经典变体。解题思路:先明确是否找得到,找不到的时候要考虑临界情况是什么。

Betty_textbook的博客 825

CAN XL和10Base-T1S全对比:在区域架构中如何选择最适合的车载通信协议?

本文深入对比了CAN XL和10Base-T1S在车载网络架构中的性能差异,通过实测数据和典型应用场景分析,为区域架构设计提供选型指南。重点探讨了带宽、延迟、成本等关键指标,帮助工程师在ADAS传感器部署和车身控制网络优化中做出明智选择。

pear55的博客 591

【AutoSAR CAN】04 - 如何使用Davinci Configurator Pro工具配置CAN的波特率

改参数为Tx Arbitration start delay value ,可用于延迟仲裁过程的起始点,用来补偿CAN收发器及线路的传输延迟,以优化传输性能。有关详细信息,请参阅硬件手册。该参数指定采样点模式,即选择多少个采样点的数量,如果选择了每比特三个样本选项,则该点标记第三个样本的位置;我们要配置CAN的波特率,其实就是要弄明白 CAN 控制器的位时序即可,具体的理论部分和EB的配置部门可参考文章《该参数表示传播延迟有多少个时间单位Tq,即上文中的Propagation delay/PROGSEG。.

2601

【力扣刷题-数组篇】704. 二分查找的思路和Java详细代码

二分查找是一种在已排序数组中查找特定元素的高效算法。初学者可能不太理解其中的思路,本文带大家详细梳理一下。

sunleo123的博客 1304

物联网Node-Red开发教程-第6章 HTTP与Web服务

本章摘要(147字): 本章系统讲解了Node-RED中的HTTP节点应用,重点包括: 三大核心HTTP节点功能:http in(接收请求)、http response(返回响应)、http request(调用外部API) 详细演示了REST API开发流程,包括路径参数(req.params)处理和响应构造 提供了创建Hello World API、传感器数据接口等实用示例 涵盖HTTP方法特性、状态码设置及响应头配置等关键知识点 通过流程图和JSON配置直观展示节点连接方式,帮助快速掌握Web服务开发

shihui2003的博客 264

二分查找算法原理与Leetcode704实战解析

二分查找是计算机科学中基于分治思想的高效搜索算法,其核心原理是通过不断折半缩小搜索范围,将时间复杂度优化至O(log n)。该算法要求输入数据必须有序,通过比较中间元素与目标值决定搜索方向的特性,使其成为处理有序数据集的首选方案。在工程实践中,二分查找不仅应用于基础数组查询(如Leetcode704题),还广泛用于数据库索引、版本控制二分定位、游戏碰撞检测等场景。针对边界条件处理和变体问题(如查找首个/末个匹配元素),需要特别注意整数溢出预防和循环终止条件设置。掌握标准模板实现与常见错误规避,能够有效提升算

weixin_30394669的博客 323

8、对比 LightGBM、XGBoost 和深度学习

本文对比了LightGBM、XGBoost和深度学习模型(特别是TabTransformer)在处理表格数据时的性能差异。从模型复杂度、数据准备、训练时间、准确性和适用场景等方面进行分析,重点探讨了三者在人口普查收入预测任务中的表现。文章详细介绍了XGBoost与LightGBM的核心特性与区别,深入讲解了TabTransformer的架构与实现,并涵盖了分类特征编码、缺失值处理和类别不平衡等关键数据预处理技术,为选择合适的表格数据建模方法提供了实践指导。

julia4scientist的博客 120

SAP Fiori 会话超时全解析:从 Launchpad 到 Identity Authentication 的统一策略

SAP Fiori会话超时机制解析与配置策略 本文深入探讨SAP Fiori项目中的会话超时机制,分析其对系统安全和用户体验的双重影响。文章系统拆解了SAP Fiori Launchpad与SAP Cloud Identity Services之间的会话超时工作原理,重点介绍了两种超时机制:服务器驱动的超时(通过SESSION_TIMEOUT_STOP_DATA_REFRESH参数控制)和UI驱动的超时(通过SESSION_TIMEOUT_INTERVAL_IN_MINUTES参数控制)。文中结合制造业产线

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

二分查找的变体问题

一. 今天来探讨一下二分查找的变体问题, 可以当做今后写二分查找的模板. 二. 普通的二分查找.(有序, 无重复) 需要注意: 1. 移位的优先级小于加号,所以加括号. 2. (start+end)/2 容易溢出, 所以写成start + ((end - start) >> 1). 3. 先判断简单情况, 即如果等于target, 则直接returnmid. 4...

qieyuan4083的博客 265

华为OD 面试手撕代码真题【岛屿的周长】

0代表水,1代表陆地,岛由陆地组成且岛内不允许有湖,让你求岛的周长。

MISAYAONE的博客 8412

二分查找及变体

每轮搜索范围,直至找到目标元素或搜索区间为空为止。

deardeer的博客 497

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

704二分查找

题目描述 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ij5mOf5t-1631589145189)(C:\Users\落雨\AppData\Roaming\Typora\typora-user-images\image-20210830185956018.png)] 解题思路 代码实现 #include <iostream> #include <vector> #include "704二分查找.h" using namespace std; in

qq_51093000的博客 154

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数据结构Day1 704. 二分查找,27. 移除元素

因为本人自律性较差,非科班,打算重启一下优快云写博客整理自己的想法的打算闲话不多说。

qq_43274397的博客 250

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

万字硬核解析!二分查找变体问题,与 bug 说拜拜!

在一个有序数组中,存在多个大小为target值的元素,请找到最后一个等于目标值的元素(可以看作所有重复元素的右边界),如果存在,返回其索引,否则返回 -1。在任意有序数组中,查找最后一个小于等于目标值的元素。如果存在,返回目标值索引,否则返回 -1。二分查找是一种针对有序数组的高效查找算法,时间复杂度为 O(logn)O(logn)O(logn)。它的核心思想非常简单,和分治思想类似。每次都取查找区间的中间元素与目标值对比,然后收缩(折半)查找区间,直到找到要查找的元素,或者区间缩小至 0。

wdj_yyds的博客 367

算法思想 从0到1:分治法——二分查找模板小结(三种:第一种基础,推荐掌握第一种,第三种是第二种的变体)

二分查找模板小结(三种:第一种基础,推荐掌握第二种,第三种是第二种的变体) 刷题要总结,以块进行刷题。还有参加周赛,哪里不会学哪块。一个是积累基础,一个是查漏补缺。加油 以力扣704题为例: 题目描述: 题解: 方法1: 循环条件为left < right。先看mid处的值与target的关系,如果相等就输出,然后划分为两个区间[left,mid -1],[mid +1,right] cl...

weixin_42042056的博客 360

704. 二分查找

算法通过维护两个指针 `left` 和 `right` 来定义当前搜索区间,每次取中间位置进行比较,根据比较结果调整搜索区间。- 防止整数溢出:也可以使用 `left + Math.floor((right - left) / 2)`- 使用 `mid = left + Math.floor((right - left) / 2)`2. **中间位置计算**:`Math.floor((left + right) / 2)`- 目标较小:`right = mid - 1`(排除mid及右边)

2503_92489546的博客 299

LeetCode | 704.二分查找

leetcode 二分查找

2301_76540835的博客 1281

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

代码随想录刷题第一天

shaozi25的博客 307

8k+字!详细解读二分查找变体问题,与 bug 说再见!

在一个有序数组中,存在多个大小为target值的元素,请找到最后一个等于目标值的元素(可以看作所有重复元素的右边界),如果存在,返回其索引,否则返回 -1。在任意有序数组中,查找最后一个小于等于目标值的元素。如果存在,返回目标值索引,否则返回 -1。二分查找是一种针对有序数组的高效查找算法,时间复杂度为 O(logn)O(logn)O(logn)。它的核心思想非常简单,和分治思想类似。每次都取查找区间的中间元素与目标值对比,然后收缩(折半)查找区间,直到找到要查找的元素,或者区间缩小至 0。

BASK2311的博客 324

leetcode 704. 二分查找

leetcode第704题——三种解法

immortalize的博客 167

【算法思想04】二分查找

从基本思想与实现、性能分析、应用三方面学习二分查找算法,并整理了部分可使用二分查找解决的例题。

甜鲸鱼的博客 924

704_AUTOSAR_TR_Methodology_文档阅读26_变体处理_一

全部学习汇总: https://github.com/GreyZhang/hack_autosar 继续梳理《AUTOSAR_TR_Methodology》。 概览 变体处理中的变体点 AUTOSAR 的变体处理在通用结构模板模板中定义。 首先,这个概念定义了将 AUTOSAR 元模型中的某些位置指定为变体点的方法。 一个点粗略地由一个条件(在什么条件下这个变体是活跃的?)和一个绑定时间(这个变体应该在什么时候被解决?)组成。...

小灰笔记 635

LeetCode算法小抄--二分查找及其变体形式

1、分析二分查找代码时,不要出现 else,全部展开成 else if 方便理解。 2、注意「搜索区间」和 while 的终止条件,如果存在漏掉的元素,记得在最后检查。 3、如需定义左闭右开的「搜索区间」搜索左右边界,只要在 nums[mid] == target 时做修改即可,搜索右侧时需要减一。 4、如果将「搜索区间」全都统一成两端都闭,好记,只要稍改 nums[mid] == target 条件处的代码和返回的逻辑即可

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 551
上一篇: 必刷?215. 数组中的第K个最大元素之:快排+归排+快速选择
下一篇: BFS图遍历:Leetcode 133. 克隆图
von Libniz
博客等级 码龄8年 421粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值