二分法查找左右边界(含代码模板)

问题1:使用mid = left+(right-left)/2 或者 mid = (left+right)/2,两者计算结果相同吗?

在大多数情况下是等价的。

mid = left + (right - left) / 2:先计算了区间长度,然后再除以2。

这种方式可以避免整数溢出问题,因为它可以确保 (right - left) 的结果不会超出整数范围。


mid = (left + right) / 2:直接将左右边界相加,然后除以2。

在某些情况下可能会导致整数溢出,特别是当 left 和 right 都很大的时候,相加的结果可能会超出整数范围。

所以推荐使用mid = left + (right - left) / 2,不会产生整数溢出问题。

问题2:while (left <= right) 和 while (left = right) 怎么选择?

下面的代码模板都是取等的情况,所以会额外有一个越界的判断,个人认为采用一样的模板不容易混淆 ,就按取等加额外判断来做吧。

查找左边界

public class BinarySearch {public int findLeftBound(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {// 如果当前中间元素等于目标值,则继续向左搜索right = mid - 1;} else if (nums[mid] < target) {// 如果当前中间元素小于目标值,则向右搜索left = mid + 1;} else {// 如果当前中间元素大于目标值,则向左搜索right = mid - 1;}}// 如果 left 越界或者 nums[left] 不等于 target,则表示 target 不在数组中if (left >= nums.length || nums[left] != target) {return -1;}return left;}public static void main(String[] args) {BinarySearch binarySearch = new BinarySearch();int[] nums = {1, 2, 2, 2, 3, 4, 5};int target = 2;int leftBound = binarySearch.findLeftBound(nums, target);System.out.println("左边界索引:" + leftBound);}
}

 

查找右边界

public class BinarySearch {public int findRightBound(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {// 如果当前中间元素等于目标值,则继续向右搜索left = mid + 1;} else if (nums[mid] < target) {// 如果当前中间元素小于目标值,则向右搜索left = mid + 1;} else {// 如果当前中间元素大于目标值,则向左搜索right = mid - 1;}}// 如果 right 越界或者 nums[right] 不等于 target,则表示 target 不在数组中if (right < 0 || nums[right] != target) {return -1;}return right;}public static void main(String[] args) {BinarySearch binarySearch = new BinarySearch();int[] nums = {1, 2, 2, 2, 3, 4, 5};int target = 2;int rightBound = binarySearch.findRightBound(nums, target);System.out.println("右边界索引:" + rightBound);}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索Java中的栈:Stack与Deque(ArrayDeque和LinkedList)

文章目录 1. 栈&#xff08;Stack&#xff09;1.1 定义方式1.2 特点1.3 栈的层次结构 2. 双端队列&#xff08;Deque&#xff09;2.1 定义方式及继承关系2.2 特点&#xff1a;2.3 ArrayDeque2.4 LinkedList2.5 Deque 的各种方法2.6 如何选择ArrayDeque和LinkedList 3. 如何选择…

冶炼金属(蓝桥杯)

文章目录 冶炼金属题目描述二分查找难点解释 冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V个普通金属 O 恰好可以冶炼出一个特殊金属 X&#xff…

【稳定检索|投稿优惠】2024年生物学与智能计算国际会议 (ICBIC 2024)

2024年生物学与智能计算国际会议 (ICBIC 2024) 2024 International Conference on Biology and Intelligent Computing 【会议简介】 2024年生物学与智能计算国际会议即将在上海召开。本次会议旨在汇聚生物学与智能计算领域的专家学者&#xff0c;共同探讨两者交叉融合的前沿…

【Linux】网络基础(一)

文章目录 一、计算机网络背景1. 网络发展2. 认识“协议” 二、网络协议初识1. 协议分层2. OSI七层模型3. TCP/IP五层&#xff08;或四层&#xff09;模型 三、网络传输基本流程1. 同局域网的两台主机通信数据包封装和分用封装分用 2. 跨网络的两台主机通信 四、网络中的地址管理…

【webrtc】源码下载与编译

目录 下载 下依赖 内存需求 &#xff01;&#xff01; 参考文章 &#xff1a; 下载 (1) windows ,centos上都会报错 &#xff08;2&#xff09; ubuntu A : 在git上设置代理 B fetch通过 ubuntu的界面 proxy设置了代理 这将会拉取webRTC源码&#xff0c;且额外加了a…

ssm043基于JavaEE的龙腾公司员工信息管理系统的设计与实现+jsp

龙腾公司员工信息管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本龙腾公司员工信息管理系统就是在这样的大环境下诞生&#xff0c;其可…

C++数据结构与算法——动态规划打家劫舍系列

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

千视电子携NDI 6前沿技术,亮相北京CCBN展呈现轻量化媒体解决方案

千视携NDI 6技术闪耀2024 CCBN展会&#xff0c;呈现轻量化媒体解决方案 2024年4月24日至26日&#xff0c;北京首钢会展中心将举办第三十届中国国际广播电视网络技术展览会&#xff08;CCBN2024&#xff09;。这是中国广播电视行业的一项重要盛会&#xff0c;将有国内外超600家…

kubectl_入门_Pod配置以及生命周期

Pod配置以及生命周期 1. Pod结构定义 每个pod中都可以包含一个或多个容器&#xff0c;这些容器可以分为两类 用户程序所在的容器&#xff0c;数量可多可少Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个 可以以它为根据&#xff0c;评估整个…

异地两分部子网重复,如何远程更改其中一个分部子网信息

环境: 分部1:子网192.168.1.0/24 分部2:子网192.168.1.0/24 问题描述: 异地两分部子网重复,如何远程更改其中一个分部子网,原本没有问题目前要与总部建ipsec提示冲突无法都建立隧道 解决方案: 先G一下,看看有啥建议 在两个异地分部网络中,如果发现有子网地址出现…

java 解析 xml 字符串转换为实体,实体转换为 xml 字符串

java 解析 xml 字符串转换为实体&#xff0c;实体转换为 xml 字符串 1. XmlCommonUtil工具类代码如下&#xff1a; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller;/*** XmlCommonUtil类用于XML字符串和对象之间…

从零开始,如何成功进入IT行业?

0基础如何进入IT行业&#xff1f; 简介&#xff1a;对于没有任何相关背景知识的人来说&#xff0c;如何才能成功进入IT行业&#xff1f;是否有一些特定的方法或技巧可以帮助他们实现这一目标&#xff1f; 在当今数字化时代&#xff0c;IT行业无疑是一个充满活力和机遇的领域。…

Linux服务器疑似被入侵

随着开源产品的越来越盛行&#xff0c;作为一个Linux运维工程师&#xff0c;能够清晰地鉴别异常机器是否已经被入侵了显得至关重要&#xff0c;个人结合自己的工作经历&#xff0c;整理了几种常见的机器被黑情况供参考。 背景信息&#xff1a;以下情况是在CentOS 6.9的系统中…

Leetcode 56. 合并区间和Leetcode 240. 搜索二维矩阵 II

文章目录 Leetcode 56. 合并区间题目描述C语言题解和思路解题思路 Leetcode 240. 搜索二维矩阵 II题目描述C语言题解和思路解题思路 Leetcode 56. 合并区间 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合…

mac上如何安装python3

mac上如何安装python3&#xff1f; 安装homebrew 在终端执行命令 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 执行完成后&#xff0c;homebrew和pip等工具就自动安装好了。 接下来安装python3.在终端…

C++生成随机数游戏

// 添加随机种子&#xff0c;作用&#xff1a;利用当前系统时间生成随机数&#xff0c;防止每次随机数都一样 srand((unsigned int)time(NULL)); #include <stdio.h> #include <windows.h> #include <iostream> #include <ctime> using namespace std;…

鸿蒙OS开发实例:【Native C++】

介绍 本篇Codelab主要介绍如何使用DevEco Studio创建一个Native C应用。应用采用Native C模板&#xff0c;实现使用NAPI调用C标准库的功能。使用C标准库hypot接口计算两个给定数平方和的平方根。在输入框中输入两个数字&#xff0c;点击计算结果按钮显示计算后的数值。 相关概…

Input Event Daemon:增强Linux输入设备的交互体验

在Linux系统中&#xff0c;设备之间的交互常常需要一些后台进程来监控并响应不同的输入事件&#xff0c;例如键盘按键、鼠标点击或系统唤醒信号。Input Event Daemon&#xff08;简称IED&#xff09;是一个用于Linux的后台服务程序&#xff0c;用以监听来自输入设备的事件&…

lanqiao.602 迷宫

题目&#xff1a; 代码&#xff1a; #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; char mp[31][51]; //稍微开大一点 char k[4]{D,L,R,U}; //按字典序记录路径 int dirx[]{1,0,0,-1},d…

学习ArkTS -- 常用组件使用

学习ArkTS 使用Deveco studio写ArkTSImage: 图片显示组件1.声明Image组件并设置图片源2. 添加图片属性 Text: 文本显示组件1. 声明Text组件并设置文本内容2. 添加文本属性 TextInput&#xff1a;文本输入框1. 声明TextInput2. 添加属性和事件 Button 组件1. 声明Button组件&…