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

【手撕数据结构】二分查找(好多细节)

🌈键盘敲烂,年薪30万🌈

目录

普通版本的二分查找:

right只负责控制边界(少了两次比较):

时间复杂度更稳定的版本:

BSLeftmost:

BSRightmost:


 

普通版本的二分查找:

  • 🏸细节1:循环判定条件是left <= right
  • ⭐细节2:mid = (left + right ) >>> 1 原因见代码注释

/**** 二分查找的实现 3个版本* 时间复杂度:O(longn)* 空间复杂度:O(1)** 细节1:循环判定条件是left <= right* 细节2:mid计算要用 >>> 因为left + right 可能越界*      例如:right = Integer.MAX_INT-1 left = 0;*      第一轮计算没问题 假设mid < target*      left = mid + 1; 这是后left+ right 就超出int的最大范围,变成负数*      原因很简单:java没有无符号数,最高位表示符号位,/ 运算是先将补码转原码 >>>位运算是直接再二进制上运算*/
public class Demo1 {public static void main(String[] args) {int[] nums = {1,4,6,8,15,76,145};int target = 145;int index1 = method1(nums, target);System.out.println(target + "索引为" + index1);System.out.println(target + "索引为" + index2);}private static int method1(int[] nums, int target) {int left = 0, right = nums.length-1;while(left <= right){//细节 用无符号右移运算符int mid = (left + right) >>> 1;if(nums[mid] > target){right = mid - 1;}else if (nums[mid] < target){left = mid + 1;}else{return mid;}}return -1;}
}

right只负责控制边界(少了两次比较):

  • 改动1:while条件是left < right
  • 改动2:right = nums.length
public class Demo1 {public static void main(String[] args) {int[] nums = {1,4,6,8,15,76,145};int target = 145;int index2 = method2(nums, target);System.out.println(target + "索引为" + index2);}
}private static int method2(int[] nums, int target) {int left = 0, right = nums.length; //right 只代表有边界,不参与比较while(left < right){int mid = (left + right) >>> 1;if(nums[mid] < target){left = mid + 1;}else if(nums[mid] > target){right = mid;}else {return mid;}}return -1;}

时间复杂度更稳定的版本:

  • 细节:减少了if比较次数
public class Demo1 {public static void main(String[] args) {int[] nums = {1,4,6,8,15,76,145};int target = 145;int index3 = method3(nums, target);System.out.println(target + "索引为" + index3);}
}    private static int method3(int[] nums, int target) {//这个最牛逼//减少循环内的比较次数int left = 0, right = nums.length;while(1 < right - left){int mid = (left + right) >>> 1;if(nums[mid] > target){right = mid;}else{left = mid;}}if(nums[left] == target){return left;}return -1;}

BSLeftmost:

/**** 应用:求成绩排名  求前任*/
public class Leftmost {public static void main(String[] args) {int[] nums = {1,2,4,4,4,6,7};int target = 3;/**** params* return 找到了 - 返回靠左的下标*        没找到 - 返回>target的最靠左下标*/int ans = BSLeftmost(nums, target);System.out.println(ans);}private static int BSLeftmost(int[] nums, int target) {int left = 0, right = nums.length -1;while(left <= right){int mid = (left+right) >>> 1;if(target > nums[mid]){left = mid + 1;} else{right = mid - 1;}}return left;}
}

BSRightmost:

/**** 求后任*/
public class Rightmost {public static void main(String[] args) {int[] nums = {1,2,4,4,4,6,7};int target = 3;/*** return 找到了返回下标*        没找到返回 <= targer的最靠右索引**/int ans = BSRightmost(nums, target);System.out.println(ans);}private static int BSRightmost(int[] nums, int target) {int left = 0, right = nums.length-1;while(left <= right){int mid = (left + right) >>> 1;if(target >= nums[mid]){left = mid + 1;}else {right = mid - 1;}}return left - 1;}
}

相关文章:

【手撕数据结构】二分查找(好多细节)

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 普通版本的二分查找&#xff1a; right只负责控制边界(少了两次比较)&#xff1a; 时间复杂度更稳定的版本&#xff1a; BSLeftmost&#xff1a; BSRightmost&#xff1a; 普通版本的二分查找&#xff1a; …...

Python+Selenium WebUI自动化框架 -- 基础操作封装

前言&#xff1a; 封装Selenium基本操作&#xff0c;让所有页面操作一键调用&#xff0c;让UI自动化框架脱离高成本、低效率时代&#xff0c;将用例的重用性贯彻到极致&#xff0c;让烦人的PO模型变得无所谓&#xff0c;让一个测试小白都能编写并实现自动化。 知识储备前提&a…...

PyCharm 【unsupported Python 3.1】

PyCharm2020.1版本&#xff0c;当添加虚拟环境发生异常&#xff1a; 原因&#xff1a;Pycharm版本低了&#xff01;不支持配置的虚拟环境版本 解决&#xff1a;下载PyCharm2021.1版本&#xff0c;进行配置成功&#xff01;...

flutter TabBar指示器

第一层tabView import package:jade/configs/PathConfig.dart; import package:jade/customWidget/MyCustomIndicator.dart; importpackage:jade/homePage/promotion/promotionPost/MyPromotionListMainDesc.dart; import package:jade/homePage/promotion/promotionPost/MyPr…...

PDF/X、PDF/A、PDF/E:有什么区别,为什么有这么多格式?

PDF 是一种通用文件格式&#xff0c;允许用户演示和共享文档&#xff0c;无论软件、硬件或操作系统如何。多年来&#xff0c;已经创建了多种 PDF 子类型来满足各个行业的不同需求。让我们看看一些最流行的格式&#xff1a;PDF/X、PDF/A 和 PDF/E。 FastReport .net下载 PDF/X …...

Microsoft发布了一份关于其产品安全修复的 11 月报告。

&#x1f47e; 平均每天有 50 多个漏洞被发现&#xff0c;其中一些会立即被网络犯罪分子利用。我们把那些现在很受网络犯罪分子欢迎&#xff0c;或者根据我们的预测&#xff0c;在不久的将来可能会被大量利用的漏洞称为趋势漏洞。 在攻击者开始利用这些漏洞之前 12 小时&#…...

12v24v60v高校同步降压转换芯片推荐

12V/24V/60V 高校同步降压转换芯片推荐&#xff1a; 对于需要高效、稳定、低噪音的降压转换芯片&#xff0c;推荐使用WD5030E和WD5105。这两款芯片都是采用同步整流技术&#xff0c;具有高效率、低噪音、低功耗等优点&#xff0c;适用于各种电子设备。 WD5030E是一款高效率…...

pip 问题

升级pip命令&#xff1a; python -m pip install --upgrade pippip不能下载pytorch&#xff1a; 这个问题我一直没解决。不知道有哪位大佬可以留言给我。把whl文件下载到本地也没有&#xff0c;pip不会进行本地文件夹搜索。...

云计算(一):弹性计算概述

云计算&#xff08;一&#xff09;&#xff1a;弹性计算概述 背景含义原理应用 背景 在实际场景中&#xff0c;经常会出现短时间内资源需求爆发式增长或长时间内资源需求不断增长&#xff0c;这时需要资源供给时刻满足需求的变化&#xff0c;保障业务正常运行。传统的供给方式…...

Qt/C++ 获取QProcess启动的第三方软件的窗体标题

Qt/C 获取QProcess启动的第三方软件的窗体标题&#xff0c;在使用EnumWindows获取窗体句柄(HWND)时&#xff0c;如果返回提前FALSE&#xff0c;则获取到的HWND状态IsWindow正常&#xff0c;但就是获取不到窗体标题。必须正常返回TRUE才能使用HWND获取到窗体标题&#xff0c;要不…...

Borland编辑器DOS系统快捷键应用

在项目中接触到DOS系统&#xff0c;该系统距离当下已经接近20年时间&#xff0c;网络上资源较少&#xff0c;因为需要用到C语言编辑器BorlandC,每次应用时难免会忘记快捷键使用&#xff0c;给使用造成很大的不便。 于是把现有收集的快捷键做出整理便于使用&#xff0c;供大家参…...

KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0

KeyarchOS的CentOS迁移实践&#xff1a;使用操作系统迁移工具X2Keyarch V2.0 作者&#xff1a; 猫头虎博主 文章目录 KeyarchOS的CentOS迁移实践&#xff1a;使用操作系统迁移工具X2Keyarch V2.0&#x1f405;摘要引言1. 迁移前的精心准备1.1 系统环境介绍1.2 深度数据验证1.2.…...

Golang抓包:实现网络数据包捕获与分析

介绍 在网络通信中&#xff0c;网络数据包是信息传递的基本单位。抓包是一种监控和分析网络流量的方法&#xff0c;用于获取网络数据包并对其进行分析。在Golang中&#xff0c;我们可以借助现有的库来实现抓包功能&#xff0c;进一步对网络数据进行分析和处理。 本文将介绍如…...

分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比

分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比 目录 分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现QPSO-SVM、PSO-SVM、SVM分类预测对比&#xff0c;运行环境Matlab2018b…...

kubernetes部署jenkins

参考&#xff1a;kubernetes 部署 Jenkins jenkins kubernetes pipeline_mob64ca14116c53的技术博客_51CTO博客 第七篇&#xff1a;kubernetes部署jenkins-CSDN博客 1、当前kubernetes集群已部署nfs服务 showmount -e 创建jenkins目录 2、添加jenkins的pvc kubectl create …...

Node.js详解

一、是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎&#xff08;Google Chrome 的内核&#xff09;&#xff0c;利用事件驱动、非阻塞和异步输入输出模型等技术提高性能 可以理解为 Node.js 就是一个服务器端的、非阻塞式I/…...

v-html命令渲染的内容,使用scoped属性的情况下,样式不起作用

v-html命令渲染的内容&#xff0c;使用scoped属性的情况下&#xff0c;样式不起作用 如&#xff1a; CSS&#xff1a; <style scoped> .question_title_text img{ display: block; height: 200px; margin: 10px auto 0 auto;} </style> HTML&#xff1a; <d…...

浅谈vue2.0和vue3.0的区别

Vue3.0相对于Vue2.0有以下改进&#xff1a; Vue 3.0 是一个新版本的 Vue.js&#xff0c;它提供了更高效的渲染性能和更强大的工具链。下面是一些 Vue 3.0 的具体用法&#xff1a; 创建 Vue 实例&#xff1a;与 Vue 2.x 相同&#xff0c;使用 Vue.createApp() 方法创建 Vue 实例…...

git clone报错SSL connect error

解决CentOS 6.6上Git操作引发的SSL连接错误问题 最近在处理一个CentOS 6.6服务器上的问题时&#xff0c;遇到了一个比较棘手的问题。我的小伙伴在操作Git时&#xff0c;发现无法执行git pull命令&#xff0c;提示找不到Git组件。在这篇文章中&#xff0c;我会详细介绍我们是如…...

LeetCode(26)判断子序列【双指针】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 判断子序列 1.题目 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;…...

混沌系统预测极限:稀疏观测、数据同化与混沌同步的信息门槛

1. 项目概述&#xff1a;从稀疏观测中预测混沌 在天气预报、湍流模拟乃至金融系统分析中&#xff0c;我们常常面临一个核心难题&#xff1a;如何利用有限、稀疏且带有噪声的观测数据&#xff0c;去准确预测一个高维、非线性的混沌系统未来的演化&#xff1f;这就像试图通过几个…...

Android HTTPS抓包失败根源:系统证书信任链详解

1. 为什么HTTPS抓包总在“证书验证失败”这一步卡死&#xff1f; 你肯定试过&#xff1a;Wireshark抓不到App的加密流量&#xff0c;Fiddler在Windows上跑得好好的&#xff0c;一换到Android手机就提示“您的连接不是私密连接”&#xff0c;Charles反复弹出证书安装提醒却始终无…...

AI 初稿查重 15%-45%?2026 毕业论文双降(降重 + 降 AI)软件全攻略

用 AI 快速生成毕业论文初稿&#xff0c;已成 2026 届毕业生的主流选择&#xff0c;但初稿查重率普遍卡在 15%-45%、AIGC 疑似率超 50% 的双重困境&#xff0c;让不少同学焦虑&#xff1a;知网 / 维普查重不达标、AI 痕迹过重被导师打回、反复修改越改越乱。想要高效解决 “降重…...

量子机器学习在日志异常检测中的应用:QULOG框架解析与实践

1. 项目概述与核心价值日志异常检测&#xff08;Log-based Anomaly Detection, LogAD&#xff09;是智能运维&#xff08;AIOps&#xff09;的基石&#xff0c;其核心任务是从海量、半结构化、充满噪声的系统日志流中&#xff0c;自动识别出预示着潜在故障或异常行为的模式。随…...

RuoYi登录三步自动化:验证码、加密密码与Cookie状态机

1. 这不是“写个脚本”&#xff0c;而是后台系统登录链路的完整逆向工程RuoYi 是国内 Java 后台开发中使用频率极高的开源框架&#xff0c;它不是玩具项目&#xff0c;而是真实企业级系统落地的“最小可行基座”——权限控制、菜单管理、代码生成、定时任务、日志审计&#xff…...

C51启动代码解析:复位向量与硬件初始化关键

1. C51启动代码解析&#xff1a;为什么复位向量不直接跳转到C代码&#xff1f;在Keil C51开发环境中&#xff0c;很多开发者第一次单步调试时会发现一个奇怪现象&#xff1a;明明项目全部用C语言编写&#xff0c;但芯片复位后PC指针并没有直接跳转到main函数&#xff0c;而是先…...

Spark Transformer:稀疏激活技术提升大模型计算效率

1. Spark Transformer架构概述在当今大规模语言模型的时代&#xff0c;计算效率已成为制约模型实际应用的关键瓶颈。传统Transformer架构中&#xff0c;前馈网络(FFN)和注意力机制占据了绝大部分计算开销&#xff0c;特别是在处理长上下文时&#xff0c;这种计算负担呈指数级增…...

量子Jacobi-Davidson方法:电子结构计算的高效算法

1. 量子Jacobi-Davidson方法&#xff1a;电子结构计算的新范式在量子计算领域&#xff0c;电子结构计算一直被视为最具潜力的应用方向之一。传统经典计算机在处理多体量子系统的哈密顿量对角化时&#xff0c;面临着计算复杂度随系统规模指数增长的困境。作为一名长期关注量子算…...

3步解锁Windows远程桌面多人连接:RDP Wrapper Library完整指南

3步解锁Windows远程桌面多人连接&#xff1a;RDP Wrapper Library完整指南 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 你是否曾因Windows家庭版无法支持多人远程桌面连接而感到困扰&#xff1f;当团队成员需要…...

超冷原子吸收成像的深度学习优化方法

1. 超冷原子吸收图像分析的技术挑战在超冷原子实验中&#xff0c;原子云的空间分布信息是理解量子态的关键指标。吸收成像技术通过测量原子云对共振激光的吸收情况&#xff0c;能够非破坏性地获取这一信息。典型的吸收成像过程需要采集三帧图像&#xff1a;包含原子的图像&…...