二分查找中的小细节

二分查找算法细节详解 二分查找算法细节详解 本文就来探究几个最常用的二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。而且,我们就是要深入细节,比如不等号是否应该带等号,mid 是否应该加一等等。分析这些细节的差异以及出现这些差异的原因,保证你能灵活准确地写出正确的二分查找算法。 零、二分查找框架 int binarySearch(int[] nums, int target) { int left = 0, right = ...; while(...) { int mid = left 阅读详情

二分查找中的小细节

主要参考《代码随想录》
力扣链接:704. 二分查找
二分查找,虽然思想非常简单,但是边界值的处理经常出问题。主要有以下两个方面:
例如到底是 while(left < right) 还是 while(left <= right),到底是right = middle呢,还是要right = middle - 1呢?
其实这两种方法都可以实现,选择哪种写法关键在于区间是如何定义的。
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
举个例子,比如说有一个数组名为nums = [2,3,5,1,4]
那么以下写法为左闭右开:

nums = [2,3,5,1,4]
left = 0
right = len(nums)
#left = 0,right = 5

数组的合法下标是0,1,2,3,4.并不能取到5,所以是左闭右开区间。
同理,以下写法是左闭右闭区间

nums = [2,3,5,1,4]
left = 0
right = len(nums) - 1
#left = 0,right = 4

在后续的代码中,都要保持区间的一致性。

左闭右开区间

对于左闭右开区间,left == right是不合法的,所以在while中写的时候应该写为while(left < right) 而在mid更新时,由于mid已经被检验过,肯定在区间外。所以若需更新left:left = mid+1,若需更新right:right = mid

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

左闭右闭区间

对于左闭右闭区间,left == right是合法的,所以在while中应该写为:while(left <= right)而在mid更新时,由于mid已经被检验过,肯定在区间外。所以若需更新left:left = mid+1,若需更新right:right = mid-1

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        begin = 0
        end = len(nums)-1
        mid = (begin+end)//2
        while(begin<=end):
            if(nums[mid] == target):
                return mid
            elif nums[mid]>target:
                end = mid - 1
            else:
                begin = mid + 1
            mid = (begin+end)//2
        return -1      
PVT(Process Voltage Temperature) 芯片PVT 阅读详情

相关推荐

真双口RAM---Quartus与Vivado开发环境区别对比

2、写和写冲突:表示两个端口写使能同时有效且写地址相同,此时需要关断一个写,把两个写端口都需要更新的值处理到一个写端口上面,任何的DP RAM 都不支持写和写冲突。以上述直方图统计使用为例,博主在仿真过程中发现,vivado真双口RAM--B端口读写延迟2个clk;1、读和写冲突:如果读和写同时有效,且读和写是同一个地址时,发生RAM读写冲突,此时会把最新的写数据直接赋给读数据,称为写穿通到读。

weixin_54470733的博客 3582

二分查找细节详解

编写二分查找的算法代码属于玄学编程,虽然看起来很简单,就是会出错,要么会漏个等号,要么少加个 1(比如不等号是否应该带等号,mid 是否应该加一等等。)。不要气馁,因为二分查找其实并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的:Although the basic idea of binary search is comparatively straightforward, ...

肥叔菌的博客 2万+

【UE5 C++开发指南】从零配置Visual Studio 2022开发环境

本文详细指导如何从零开始为UE5 C++开发配置Visual Studio 2022环境。文章强调了VS2022与UE5的深度兼容性,并逐步讲解了社区版下载、核心工作负载(如“使用C++的游戏开发”)与组件安装、界面优化、专属工具设置以及首个C++项目的创建与验证流程,帮助开发者高效搭建专业开发环境。

weixin_29016865的博客 392

二分查找的细节

文章目录二分查找的细节1、 二分查找的使用场景2、关注的细节问题3、寻找一个 target(最基本的二分查找)4.寻找左侧边界的二分搜索5.寻找右侧边界的二分查找6、三种情况统一,使用闭区间来完成 二分查找的细节 1、 二分查找的使用场景 场景 一 (最经典的二分查找使用场景):给定一个升序数组int[] nums,查找是否存在目标值target,如果存在返回该值/返回true/返回该值的下标值,不存在返回 -1 / 返回 false。 场景 二:现在我们要查找的目标值不止一个,返回该目标值的左边界/右边

qq_40793726的博客 414

从零开始:Vivado中自定义串口通信IP核的完整实现

本文详细介绍了在Vivado中从零开始实现自定义串口通信IP核的完整流程,包括Verilog核心代码编写、仿真验证、IP核封装与参数化配置技巧。通过AXI-Lite总线实现动态配置,提升FPGA开发效率,适用于各种嵌入式系统通信需求。

weixin_29274969的博客 324

AUTOSAR进阶图解==>AUTOSAR_SWS_COM

AUTOSAR COM模块是AUTOSAR通信堆栈的核心组件,提供信号导向的通信服务。该模块位于通信服务层,连接RTE与PDU Router,主要功能包括信号封装/提取、传输模式管理、信号路由、超时监控和字节序转换等。COM模块架构分为应用层、通信服务层和通信抽象层,包含信号管理、I-PDU处理、传输模式管理等组件。其配置结构包括顶层容器、I-PDU组、I-PDU和信号等多层次配置对象,支持丰富的参数设置。模块采用严格的状态管理机制,包括模块状态和I-PDU组状态转换,确保通信可靠性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1242

二分查找:思路很简单,细节是魔鬼

文章目录1. 简介2. 最简单的二分查找3. 4种常见的二分查找变形问题3.1 查找第一个值等于给定值的元素3.2 查找最后一个值等于给定值的元素3.3 查找第一个大于等于给定值的元素3.4 查找最后一个小于等于给定值的元素Reference 1. 简介 二分查找(Binary Search)算法,也叫折半查找算法,二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0 二分查找的时间复

xylitolz的博客 6563

【AI for Medecine】吴恩达医学图像AI专项课程(诊断、预测、治疗)

近期需要简单了解AI4Science上的一些应用,看到吴恩达大佬的专项课程,于是开始来个“全面”的了解--医学人工智能(诊断、预测、治疗)。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 765

二分查找算法细节与查找左右侧边界

目录 二分查找的框架 寻找一个数(基本的二分搜索) 寻找左侧边界的二分搜索 寻找右侧边界的二分查找 最后总结 我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively st...

今天吃了吗的博客 1万+

学Simulink——控制执行场景实例:基于Simulink的智能车辆电子稳定控制(ESC)仿真

本文完成了基于 Simulink 的智能车辆电子稳定控制(ESC),实现了:✅ 构建含轮胎非线性的车辆动力学模型✅ 设计滑模横摆稳定性控制器✅ 实现四轮制动力分配逻辑✅ 验证在双移线低附着场景下的卓越稳定性✅ 为主动安全控制系统开发提供完整范式。

xiaoheshang_123的博客 528

GeoServer改造Springboot源码一(公共部分)

今天开始开启关于GeoServer的一个全新系列,主要是把改造Springboot后的详细代码粘贴出来,此文应配合《》系列共同阅读,按照前系列的时间顺序结合此系列的源码展示可以快速构建GeoServer功能的二次封装的后端系统。

龙井的专栏 1902

二分查找算法的细节剖析

原文:https://www.cnblogs.com/kyoner/p/11080078.html 我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky… 这句话可以这样理解:思路很简单

JackComeOn的博客 437

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

weixin_69237381的博客 907

二分查找的魔鬼细节探究

二分查找的魔鬼细节探究

weixin_51456741的博客 424

VC中sqlite的使用

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

二分查找算法模板及其细节

二分查找算法模板及其细节 本文就来探究几个最常用的二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。 而且,我们就是要深入细节,比如while循环中的不等号是否应该带等号,mid 是否应该加一等等。分析这些细节的差异以及出现这些差异的原因,保证你能灵活准确地写出正确的二分查找算法。 一、二分查找的框架 int binarySearch(int[] nums, int target) { int left = 0, right = ...; while(...) { i

西瓜的博客 245

visio安装包

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

二分查找的魔鬼细节详解

折半查找的代码有许多种,思路都是一样的,下面是一个模板 public int binarySearch(int[] nums, int target) { int low = 0; int high = nums.length - 1; while(low <= high) { int mid = low + (high - low) / 2;//防止整型溢出 if(nums[mid] <

weixin_45907832的博客 453

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【转载】二分查找算法细节详解

文章出处:二分查找算法细节详解 思路 我相信对很多读者朋友来说,编写二分查找的算法代码属于玄学编程,虽然看起来很简单,就是会出错,要么会漏个等号,要么少加个 1。 不要气馁,因为二分查找其实并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightfor...

YzlCoder的记事本 240

二分查找+所有细节保姆级详解

本文就来探究几个最常用的二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。而且,我们就是要深入细节,比如不等号是否应该带等号,mid 是否应该加一等等。分析这些细节的差异以及出现这些差异的原因,保证你能灵活准确地写出正确的二分查找算法。 零、二分查找框架 int binarySearch(int[] nums, int target) { int left = 0, right = ...; while(...) { int mid = left + (right -

weixin_43739821的博客 216

二分查找,关键在细节!

二分法思路其实很简单,但是细节是其真正的难点,二分法最常见的场景有3种:寻找一个数、寻找左侧边界、寻找右侧边界。 这里总结一下二分法的一些细节问题,比如什么时候while(…)里面使用=,什么时候left = mid,什么时候left = mid+1… 下面这个是一个二分法的模板: int binarySearch(int[] nums, int target) { int left = 0, right = ...; while(...) { int mid = (rig

weixin_45394002的博客 290

关于二分查找的一个细节问题

       如果想要找到一个有重复元素(没有也行)的有序数列中第一个大于等于x的元素的下标,只要将最基本的二分查找的代码稍作修改即可。而且可以总结出一个行之有效能够解决一类问题的模板。我在准备算法考试的过程中多次使用了这个代码,但是直到今天因为出现了超时的问题我才发现原来这么短短几行代码还有不少值得注意的细节。在详细分析之前首先贴上一段用于解决一开始提到的...

LinxRds的博客 475
上一篇: 国科大-自然语言处理复习
Kilig*
博客等级 码龄7年 752粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Kilig*

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

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

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

打赏作者

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

抵扣说明:

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

余额充值