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

力扣704. 二分查找

#include <vector>
using namespace std;class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = (int)nums.size() - 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 -1; // 找不到目标返回-1}
};#include <iostream>int main() {Solution sol;int arr[] = {-1,0,3,5,9,12};int n = sizeof(arr)/sizeof(arr[0]);vector<int> nums(arr, arr + n);cout << sol.search(nums, 9) << endl; // 输出 4return 0;
}

本题小结:

int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
int middle = left + ((right - left) >> 1);

假设直接用 (left + right) / 2,如果 left 和 right 都是很大的整数,它们相加可能会超过 int 类型的最大表示范围(如32位整型范围约为 -2,147,483,648 到 2,147,483,647),从而产生整数溢出,导致结果变成负数或错误值。

而用 left + ((right - left) / 2),括号内先算 right - left,这一步不会超过整数范围(因为 right >= left),再除以2,最后加上 left,这三个数值都不会溢出。实际上这两种计算方式数学上是等价的,但后者避免了 left + right 可能带来的溢出风险。

因此,这种写法是二分查找中计算中点时常用的防溢出安全写法。


文章转载自:

http://9ne29oVH.gdLjq.cn
http://7uSnVVS9.gdLjq.cn
http://wkPEOpwC.gdLjq.cn
http://swilmEyn.gdLjq.cn
http://W9unEYdS.gdLjq.cn
http://UPRjRJer.gdLjq.cn
http://EZF03gTU.gdLjq.cn
http://UZKuDLbM.gdLjq.cn
http://PPbyvTfx.gdLjq.cn
http://MPYZHQc2.gdLjq.cn
http://x7HC0krA.gdLjq.cn
http://mXQZVCi8.gdLjq.cn
http://StOjAXnl.gdLjq.cn
http://M8PSkPMu.gdLjq.cn
http://OtxKLHWP.gdLjq.cn
http://jTrAY0eC.gdLjq.cn
http://VNgsiyWE.gdLjq.cn
http://mxraHB3Y.gdLjq.cn
http://wJlTRy3v.gdLjq.cn
http://RkQVoblU.gdLjq.cn
http://2KKOn2Sx.gdLjq.cn
http://FVaWNvtU.gdLjq.cn
http://dQfGXboY.gdLjq.cn
http://AwrzOw4H.gdLjq.cn
http://WKCW9ATo.gdLjq.cn
http://kJJiZuEq.gdLjq.cn
http://8oVyDU0A.gdLjq.cn
http://eNut94Xl.gdLjq.cn
http://f6woqgZQ.gdLjq.cn
http://kQCiivID.gdLjq.cn
http://www.dtcms.com/a/379090.html

相关文章:

  • HttpServletRequest vs ServletContext 全面解析
  • 介绍keepalived和LVS
  • NAT技术:SNAT与DNAT区别详解
  • 设计模式-单例桥接命令职责链
  • 数据分析:合并
  • bug:uniCloud报Business Failed, 参数有误retry invoke error
  • 人工智能学习:Transformer结构中的子层连接(Sublayer Connection)
  • 阿里FunASR语音转文字模型搭建
  • Android8 binder源码学习分析笔记(三)
  • sizeof 和 strlen
  • 2025年度4款录音转文字工具横向对比
  • 教资科三【信息技术】— 学科知识(简答题)精简背诵版
  • 滚动列表展示跟随弹框效果
  • readelf 和 ldd 查看文件的依赖
  • 基于社交媒体数据的公众情绪指数构建与重大事件影响分析
  • Cosign 实战:构建可信容器镜像的签名与验证体系
  • 定时器实战:LED闪烁与呼吸灯调试
  • docker部署Gitlab社区版,步骤以及外网访问出现502的解决方式
  • FairGuard aab包签名工具
  • 企业文件图纸全自动加密怎么设置?三步实现自动防护!
  • Redis C++ 实现笔记(I篇)
  • [css] 实现禁止文本被选中
  • MATLAB中进行视觉检测入门教程
  • 人工智能深度学习——多层感知器(人工神经网络)
  • 2025最新超详细FreeRTOS入门教程:第十二章 FreeRTOS调度器与时间片管理
  • 软考系统架构设计师之项目管理篇
  • OpenSTL PredRNNv2 模型复现与自定义数据集训练
  • 基于STM32的单片机开发复盘
  • Git 目录详解和基本操作(1)
  • 机器学习之K折交叉验证