当前位置: 首页 > ops >正文

二分法算法技巧-思维提升

背景:

在写力扣题目“搜素插入位置 ”时,发现二分法的一个细节点,打算记录下来,先看一张图:

我们知道,排序数组,更高效的是二分查找法~~~而二分法就是切割中间,定义left是最开始的,也就是下标为0;right 是最后一个

那么这个mid到底怎么写? 

简单想到的是:int mid = (left + right) / 2;

但是还有更好的写法!那就是:int mid = left + (right - left) / 2

原因解析

1. 防止整数溢出(关键原因)

假设:

left = 2000000000right = 2100000000 (21亿)

使用 (left + right) / 2的情况下:

left + right = 2000000000 + 2100000000 = 4100000000

但 int 最大只能存储 2147483647(约21亿),会导致整数溢出变成负数!

使用 left + (right - left) / 2的情况下:

right - left = 100000000
(right - left)/2 = 50000000
left + 50000000 = 2050000000

完全不会溢出!!!!


2. 数学等价性

两者数学上是等价的:

left + (right - left)/2

= left + right/2 - left/2

= left/2 + right/2

= (left + right)/2

但计算机的整数运算会截断小数,所以写法不同会影响结果。

对比总结

写法安全性可读性推荐度
(left + right)/2可能溢出更直观❌ 不推荐
left + (right - left)/2绝对安全稍复杂✅ 推荐

案例题目练习:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

示例 1:

输入: nums = [1,3,5,6], target = 5

输出: 2

代码实现:

class Solution {public int searchInsert(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return left;}
}

http://www.xdnf.cn/news/9907.html

相关文章:

  • 接口自动化测试用例的编写方法
  • pandas数据分析
  • 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
  • Idea使用springAI搭建MCP项目
  • torch.zeros()用法简介
  • c# 获取电脑 分辨率 及 DPI 设置
  • Root权限:解锁Android的终极力量
  • WSL里执行python深度学习的一些方法记录
  • 如何优化Hive的查询性能?请详细说明查询优化的各个层面(SQL优化、配置优化、资源优化等)和具体方法。
  • onlyoffice docspace 协作空间企业版使用秘籍-1.如何连接外部存储
  • 数据结构之队列:原理与应用
  • 下载即转化的商业密码:解析华为应用商店CPD广告的智能投放逻辑
  • 近期知识库开发过程中遇到的一些问题
  • Spring MVC 框架
  • BERT***
  • Linux多线程(六)之线程控制4【线程ID及进程地址空间布局】
  • 记录一次apisix上cros配置跨域失败的问题
  • 如何使用windows下的vscode连接到本地虚拟机的linux
  • 浏览器指纹科普 | Canvas 指纹是什么?
  • 4.2.2 Spark SQL 默认数据源
  • React从基础入门到高级实战:React 高级主题 - React Concurrent 特性:深入探索与实践指南
  • Sublime Text 4格式化JSON无效的解决方法
  • 换宽带ip地址会变吗?同一个宽带如何切换ip地址
  • 7.3 Organizing data into training batches
  • 易路 iBuilder:解构企业 AI 落地困境,重构智能体时代生产力范式
  • 顶刊SCS | 基于视觉语言大模型推理分割的建筑足迹尺度功能分类, 样本数据和代码已开源!
  • QNAP MEMOS 域名访问 SSL(Lucky)
  • 广州邮科高频开关电源:以创新科技赋能通信能源绿色未来
  • 工控机安装lubuntu系统
  • Med-R1论文阅读理解-1