二分算法(模板)

例题1:

704. 二分查找 - 力扣(LeetCode)

算法原理:(二分)

通过遍历也可以通过,但是二分更优且数据量越大越能体现。

二分思路:

1.mid1 =  (left + right)/2 与 mid2 = right + (right - left)/2区别。

如果不考虑数据范围: (left + right)/2  = right + (right - left)/2,但越界就不一样了。

mid1 =  (left + right)/2 :可能越界

mid2 = left+ (right - left)/2 : 可以防止越界

2.mid1 = (right + left)/2 与 mid2 = (right + left + 1)/2区别。

(right + left)/2  : 向下取整

(right + left + 1)/2 :向上取整

举个例子: right = 3,left = 4,(right + left)/2  = 3,(right + left + 1)/2 = 4;

                   right = 2,left = 4,(right + left)/2  = 3,(right + left + 1)/2 = 3;

这里不会严格用数学方式去证明,那样太花时间了,感兴趣的话网上搜搜,我们直接给出结论,当right + left 结果为偶数时,mid1 与 mid2 是没有区别的,但结果为奇数时就会相差1,不要小看了这一点区别,不注意这里,就很有可能写出死循环,具体我们在下面例题里体现。

这里不能通过调整上下取整的方式来避免死循环。但是可以通过增加一行代码来弄

(       if(left == right && nums[left] != target) break;      )

代码:

//暴力可以过😯public int search(int[] nums, int target) {int n = nums.length;for(int i = 0;i < n;i++){if(nums[i] > target){break;}if(nums[i] == target) return i;}return -1;}
     //二分public int search(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){return mid;}else {right = mid-1;}}return -1;}
//二分,调整后public int search(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){return mid;}else {right = mid;}if(left == right && nums[left] != target) break; }return -1;}

 

通过上面两幅幅图我们就可以感受到上,下取整差1,如果调整不好便会出现死循环。这里只列举了向下取整,避免死循环情况。还有一种是向上取整,避免死循环情况。(再往下的例题就不会,所这么多了。) 

如下例题都是可以利用二分解决的,这里就提一点,二分的使用场景并不一定非要整个序列有序,而是依据你的需求,巧妙的去使用它。

例题2:

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

例题3:

162. 寻找峰值 - 力扣(LeetCode)

例题4:

153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)

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

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

相关文章

VUE3 学习笔记2 computed、watch、生命周期、hooks、其他组合式API

computed 计算属性在vue3中&#xff0c;虽然也能写vue2的computed&#xff0c;但还是更推荐使用vue3语法的computed。在Vue3中&#xff0c;计算属性是组合式API&#xff0c;要想使用computed&#xff0c;需要先对computed进行引入&#xff1a;import { computed } from vuecomp…

【java面试day13】mysql-定位慢查询

文章目录问题&#x1f4ac; Question 1相关知识问题 &#x1f4ac; Question 1 Q&#xff1a;这条sql语句执行很慢&#xff0c;你如何分析呢&#xff1f; A&#xff1a;当一条 SQL 执行较慢时&#xff0c;可以先使用 EXPLAIN 查看执行计划&#xff0c;通过 key 和 key_len 判…

3分钟解锁网页“硬盘“能力:离线运行VSCode的新一代Web存储技术

Hi&#xff0c;我是前端人类学&#xff08;之前叫布兰妮甜&#xff09;&#xff01; “这不是浏览器&#xff0c;这是装了个硬盘。” —— 用户对现代Web应用能力的惊叹 随着Origin Private File System和IndexedDB Stream等新技术的出现&#xff0c;Web应用现在可以在用户的设…

LT6911GXD,HD-DVI2.1/DP1.4a/Type-C 转 Dual-port MIPI/LVDS with Audio 带音频

简介LT6911GXD是一款高性能HD-DVI2.1/DP1.4a/Type-c转Dual-port MIPI/LVDS芯片&#xff0c;兼容 HDMI2.1、HDMI2.0b、HDMI1.4、DVI1.0、DisplayPort 1.4a、eDP1.4b 等多种视频接口标准。支持4K(38402160)60Hz的DSC直通。应用场景AR/VR设备LT6911GXD 支持高达 4K&#xff08;384…

【100页PPT】数字化转型某著名企业集团信息化顶层规划方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808811/91662628 资料解读&#xff1a;数字化转型某著名企业集团信息化顶层规划方案 详细资料请看本解读文章的最后内容 作为企业数字化转型领域的…

高精度标准钢卷尺优质厂家、选购建议

高精度标准钢卷尺的优质厂家通常具备精湛工艺与权威精度认证等特征&#xff0c;能为产品质量提供保障。其选购需兼顾精度标识、使用场景、结构细节等多方面&#xff0c;具体介绍如下&#xff1a;一、高精度标准钢卷尺优质厂家**1、河南普天同创&#xff1a;**PTTC-C5标准钢卷尺…

38 C++ STL模板库7-迭代器

C STL模板库7-迭代器 文章目录C STL模板库7-迭代器一、迭代器的核心作用二、迭代器的五大分类与操作三、关键用法与代码示例1. 迭代器的原理2. 迭代器用法与示例3. 迭代工具用法示例4. 使用技巧迭代器是C中连接容器与算法的通用接口&#xff0c;提供了一种访问容器元素的统一方…

【0基础3ds Max】学习计划

3ds Max 作为一款功能强大的专业 3D 计算机图形软件&#xff0c;在影视动画、游戏开发、建筑可视化、产品设计和工业设计等众多领域有着广泛的应用。 目录前言一、第一阶段&#xff1a;基础认知&#xff08;第 1 - 2 周&#xff09;​二、第二阶段&#xff1a;建模技术学习&…

用 Enigma Virtual Box 将 Qt 程序打包成单 exe

上一篇介绍了用windeployqt生成可运行的多文件程序,但一堆文件分发起来不够方便。有没有办法将所有文件合并成一个 exe? 答案是肯定的 用Enigma Virtual Box工具就能实现。本文就来讲解如何用它将 Qt 多文件程序打包为单一 exe,让分发更轻松。 其中的 一定要选 第二个 一…

【LeetCode 热题 100】45. 跳跃游戏 II

Problem: 45. 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说&#xff0c;如果你在索引 i 处&#xff0c;你可以跳转到任意 (i j) 处&#xff1a; 0 < j < nums[i] 且 i j &…

池式管理之线程池

1.初识线程池问&#xff1a;线程池是什么&#xff1f;答&#xff1a;维持管理一定数量的线程的池式结构。&#xff08;维持&#xff1a;线程复用 。 管理&#xff1a;没有收到任务的线程处于阻塞休眠状态不参与cpu调度 。一定数量&#xff1a;数量太多的线程会给操作系统带来线…

婴儿 3D 安睡系统专利拆解:搭扣与智能系带的锁定机制及松紧调节原理

凌晨2点&#xff0c;你盯着婴儿床里的小肉团直叹气。刚用襁褓裹成小粽子才哄睡的宝宝&#xff0c;才半小时就蹬开了裹布&#xff0c;小胳膊支棱得像只小考拉&#xff1b;你手忙脚乱想重新裹紧&#xff0c;结果越裹越松&#xff0c;裹布滑到脖子边&#xff0c;宝宝突然一个翻身&…

pandas中df.to _dict(orient=‘records‘)方法的作用和场景说明

df.to _dict(orientrecords) 是 Pandas DataFrame 的一个方法&#xff0c;用于将数据转换为字典列表格式。以下是详细解释及实例说明&#xff1a; 一、核心含义作用 将 DataFrame 的每一行转换为一个字典&#xff0c;所有字典组成一个列表。 每个字典的键&#xff08;key&#…

阿里云Anolis OS 8.6的公有云仓库源配置步骤

文章目录一、备份现有仓库配置&#xff08;防止误操作&#xff09;二、配置阿里云镜像源2.1 修改 BaseOS 仓库2.2 修改 AppStream 仓库三、清理并重建缓存四、验证配置4.1 ​检查仓库状态​&#xff1a;五、常见问题解决5.1 ​HTTP 404 错误5.2 ​网络连接问题附&#xff1a;其…

回归预测 | Matlab实现CNN-BiLSTM-self-Attention多变量回归预测

回归预测 | Matlab实现CNN-BiLSTM-self-Attention多变量回归预测 目录回归预测 | Matlab实现CNN-BiLSTM-self-Attention多变量回归预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 1.Matlab实现CNN-BiLSTM融合自注意力机制多变量回归预测&#xff0c;CNN-BiLSTM-self-…

103、【OS】【Nuttx】【周边】文档构建渲染:Sphinx 配置文件

【声明】本博客所有内容均为个人业余时间创作&#xff0c;所述技术案例均来自公开开源项目&#xff08;如Github&#xff0c;Apache基金会&#xff09;&#xff0c;不涉及任何企业机密或未公开技术&#xff0c;如有侵权请联系删除 背景 接之前 blog 【OS】【Nuttx】【周边】文…

转换一个python项目到moonbit,碰到报错输出:编译器对workflow.mbt文件中的类方法要求不一致的类型注解,导致无法正常编译

先上结论&#xff1a;现在是moon test的时候有很多报错&#xff0c;消不掉。问题在Trae中用GLM-4.5模型&#xff0c;转换一个python项目到moonbit&#xff0c;碰到报错输出&#xff1a;报错输出经过多次尝试修复&#xff0c;我发现这是一个MoonBit编译器的bug。编译器对workflo…

【C#补全计划】事件

一、事件的概念1. 事件是基于委托的存在&#xff0c;是委托的安全包裹&#xff0c;让委托的使用更具有安全性2. 事件是一种特殊的变量类型二、事件的使用1. 语法&#xff1a;event 委托类型 事件名;2. 使用&#xff1a;&#xff08;1&#xff09;事件是作为成员变量存在与类中&…

java内存缓存

我们在项目中会经常使Redis和Memcache,但是简单项目就没必要使用专门的缓存框架来增加系统的复杂性。用Java代码逻辑就能实现内存级别的缓存。1.定时任务线程池使用ScheduledExecutorService结合ConcurrentHashMap&#xff0c;如果你使用的是ConcurrentHashMap&#xff0c;你可…

智能工厂生产监控大屏-vue纯前端静态页面练习

学习前端还是非常有意思的&#xff0c;因为前端真的是可见即所得&#xff0c;可以做出来非常好看漂亮的页面&#xff0c;最近我就在使用前端技术 做一些大屏报表&#xff0c;在制作这些大屏报表过程中&#xff0c;又熟练的练习了自己的学到的相关的前端技术&#xff0c;接下来把…