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

背景:

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

我们知道,排序数组,更高效的是二分查找法~~~而二分法就是切割中间,定义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.pswp.cn/news/907667.shtml

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

相关文章

Python 训练营打卡 Day 40

训练和测试的规范写法 一、黑白图片的规范写法&#xff0c;以MNIST数据集为例 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 用于加载MNIST数据集 from torch.utils.data import DataLoader # 用于创建…

数据结构之栈:原理与常用方法

1. 栈的定义 Stack是Vector的一个子类&#xff0c;它实现标准的后进先出堆栈。Stack只定义了创建空堆栈的默认构造方法。&#xff08;实际上是实现了List接口&#xff0c;因为Vector是List的子类&#xff09;。 Stack() // 创建一个空栈 2. 栈的基本操作 // 压栈操作 publi…

鸿蒙OSUniApp 开发支持图片和视频的多媒体展示组件#三方框架 #Uniapp

使用 UniApp 开发支持图片和视频的多媒体展示组件 前言 在现代移动应用中&#xff0c;图片和视频已成为内容展示的主流形式。一个优秀的多媒体展示组件不仅能提升用户体验&#xff0c;还能增强产品的互动性和视觉冲击力。随着鸿蒙&#xff08;HarmonyOS&#xff09;生态的不断…

STM32CubeMX,arm-none-eabi-gcc简单试用

在windows下&#xff0c;为stm32系列单片机编程&#xff0c;keil有了免费的试用版&#xff0c;有很多开发板示例&#xff0c;给学习单片机编程带来很大的方便。 STM32CubeMX提供了stm32单片机的功能设置&#xff0c;在输出方式上给出了几种方式&#xff0c;有mdk&#xff08;k…

灌水论坛系统总体设计文档

一、实验题目 灌水论坛系统 二、实验目的 旨在通过一个相对完整且功能丰富的Web应用实例&#xff0c;全面地实践和巩固Web开发所需的各项核心技术和工程方法&#xff0c;从而提升其综合应用能力和解决实际开发问题的能力。它不仅仅是完成一个软件&#xff0c;更是一个学习、…

Android 13中 配置签名文件与内置相应的Apk

目录 1.问题场景 2.实现思路 3.将测试代码做成APK并配置签名 4.将apk内置到系统当中的方法 1.问题场景 在展讯平台中Android13的源码已知的情况下&#xff0c;客户写了一个测试类用于调用系统中的一些接口来检验一些功能。为了方便调试排查问题我首先的思路是将客户写的测试…

HarmonyOS 5 应用开发导读:从入门到实践

一、HarmonyOS 5 概述 HarmonyOS 5 是华为推出的新一代分布式操作系统&#xff0c;其核心设计理念是"一次开发&#xff0c;多端部署"。与传统的移动操作系统不同&#xff0c;HarmonyOS 5 提供了更强大的跨设备协同能力&#xff0c;支持手机、平板、智能穿戴、智慧屏…

C语言创意编程:用趣味实例玩转基础语法(4)

文章目录 0. 前言1. &#x1f308; 彩虹文字生成器1.1 程序效果展示1.2 完整代码解析1.3 关键技术详解1.3.1 Windows控制台API1.3.2 颜色编码1.3.3 安全输入1.3.4 跨平台考虑 2. &#x1f3b5; 简易音乐播放器2.1 程序效果展示2.2 完整代码解析2.3 关键技术详解2.3.1 Windows B…

【专题】神经网络期末复习资料(题库)

神经网络期末复习资料&#xff08;题库&#xff09; 链接&#xff1a;https://blog.csdn.net/Pqf18064375973/article/details/148332887?sharetypeblogdetail&sharerId148332887&sharereferPC&sharesourcePqf18064375973&sharefrommp_from_link 【测试】 Th…

Python训练营打卡 Day41

简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 → Batch…

leetcode216.组合总和III:回溯算法中多条件约束下的状态管理

一、题目深度解析与组合约束条件 题目描述 找出所有相加之和为n的k个数的组合&#xff0c;且满足以下条件&#xff1a; 每个数只能使用一次&#xff08;范围为1到9&#xff09;所有数字均为唯一的正整数组合中的数字按升序排列 例如&#xff0c;当k3&#xff0c;n9时&#…

Java面试实战:从Spring到大数据的全栈挑战

Java面试实战&#xff1a;从Spring到大数据的全栈挑战 在某家知名互联网大厂&#xff0c;严肃的面试官正在面试一位名叫谢飞机的程序员。谢飞机以其搞笑的回答和对Java技术栈的独特见解而闻名。 第一轮&#xff1a;Spring与微服务的探索 面试官&#xff1a;“请你谈谈Spring…

基于vue框架的动物园饲养管理系统a7s60(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;饲养员,健康登记,工作进度,动物信息,进食信息,动物健康,动物医治,饲料信息,工作留言 开题报告内容 基于Vue框架的动物园饲养管理系统开题报告 一、研究背景与意义 &#xff08;一&#xff09;研究背景 随着城市化进程加快和公众对生…

docker镜像与dockerfile

一、docker镜像 1.什么是镜像 容器解决应用开发、测试和部署的问题&#xff0c;而镜像解决应用部署环境问题。镜像是一个只读的容器模板&#xff0c; 打包了应用程序和应用程序所依赖的文件系统以及启动容器的配置文件&#xff0c;是启动容器的基础。镜像所打 包的文件内容就是…

流媒体基础解析:音视频封装格式与传输协议

在视频处理与传输的完整流程中&#xff0c;音视频封装格式和传输协议扮演着至关重要的角色。它们不仅决定了视频文件的存储方式&#xff0c;还影响着视频在网络上的传输效率和播放体验。今天&#xff0c;我们将深入探讨音视频封装格式和传输协议的相关知识。 音视频封装格式 什…

普中STM32F103ZET6开发攻略(一)

各位看官老爷们&#xff0c;点击关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 目录 普中STM32F103ZET6开发攻略 1. GPIO端口实验——点亮LED灯 1.1 实验目的 1.2 实验原理 1.3 实验环境和器材…

AWS API Gateway 配置WAF(中国区)

问题 需要给AWS API Gateway配置WAF。 AWS WAF设置 打开AWS WAF首页&#xff0c;开始创建和配置WAF&#xff0c;如下图&#xff1a; 设置web acl名称&#xff0c;然后开始添加aws相关资源&#xff0c;如下图&#xff1a; 选择资源类型&#xff0c;但是&#xff0c;我这里出…

测试分类详解

测试分类 一、按测试对象分类 1. 界面测试 1.1 测试内容介绍 界面测试验证用户界面(UI)的视觉呈现和交互逻辑&#xff0c;确保符合设计规范并提供良好的用户体验。测试内容包括&#xff1a; 页面布局和元素对齐字体、颜色和图标一致性交互反馈&#xff08;悬停、点击状态&a…

打开NRODIC SDK编译不过怎么处理,keil与segger studio

打开NRODIC SDK编译不过怎么处理,以下是keil处理. 1,如图,不要安装安装也不会过 2. 不要安装点击否 3.点击确定后进来这个样子 4.这里选择这个勾,OK后就不会再有后面的pack_license 5.去掉勾后这里要选择自己SDK对应的pack版本,我的是8.27.0 6.OK后弹出个界面也要反复选择…

HarmonyOS ArkUI-X开发中的常见问题及解决方案

一、跨平台编译与适配问题 1. 平台特定API不兼容 ‌问题现象‌&#xff1a;使用Router模块的replaceUrl或startAbility等鸿蒙专属API时&#xff0c;编译跨平台工程报错cant support crossplatform application。 ‌解决方案‌&#xff1a; 改用ohos.router的跨平台封装API&a…