数据结构与算法-二分查找法

基础版:

/*** 使用二分查找算法在一个有序数组中查找目标值的位置。* 如果找到目标值,则返回其索引;如果没有找到,则返回-1。** @param a 一个已经按升序排序的整型数组* @param target 需要在数组中查找的目标值* @return 如果找到目标值,则返回其在数组中的索引;否则返回-1*/
public static int binarySearchBalance(int[] a, int target) {// 初始化两个指针 i 和 j,分别指向数组的起始位置和结束位置int i = 0; int j = a.length - 1;// 当 i 和 j 之间的距离大于1时继续循环// 注意:原条件 "1<j-i" 应该是 "1 < j - i" 的误写,正确的应该是 "i < j - 1"while (i < j - 1) { // 计算中间点 m,使用无符号右移操作符 >>> 1 来避免可能的溢出问题int m = (i + j) >>> 1; // 如果目标值小于中间点的值,则调整右边界 j 到 mif (target < a[m]) {j = m;} else {// 否则,调整左边界 i 到 mi = m;}}// 检查最终位置 i 处的元素是否等于目标值// 如果是,则返回其索引;如果不是,则返回-1表示未找到return (a[i] == target) ? i : -1;
}

插入值:

/*** 在指定范围内使用二分查找算法在一个有序数组中查找目标值的位置。* 如果找到目标值,则返回其索引;如果没有找到,则返回一个负数表示插入点。** @param a 一个已经按升序排序的长整型数组* @param fromIndex 查找范围的起始索引(包含)* @param toIndex 查找范围的结束索引(不包含)* @param key 需要在数组中查找的目标值* @return 如果找到目标值,则返回其在数组中的索引;*         如果未找到,则返回一个负数,表示目标值应插入的位置(-(插入点) - 1)*/
private static int binarySearch0(long[] a, int fromIndex, int toIndex, long key) {// 初始化两个指针 low 和 high,分别指向查找范围的起始和结束位置int low = fromIndex;int high = toIndex - 1;// 当 low 小于等于 high 时继续循环while (low <= high) {// 计算中间点 mid,使用无符号右移操作符 >>> 1 来避免可能的溢出问题int mid = (low + high) >>> 1;// 获取中间点位置的值long midVal = a[mid];// 如果中间点的值小于目标值,则调整左边界 low 到 mid + 1if (midVal < key) {low = mid + 1;}// 如果中间点的值大于目标值,则调整右边界 high 到 mid - 1else if (midVal > key) {high = mid - 1;}// 如果中间点的值等于目标值,则返回该中间点索引,表示找到了目标值else {return mid; // key found}}// 如果没有找到目标值,返回一个负数,表示目标值应插入的位置(-(插入点) - 1)return -(low + 1);  // key not found.
}

Leftmost 与 Rightmost:

如果我们希望返回最左侧元素,如对于数组 [1, 2, 3, 4, 4, 5, 6, 7],查找元素4,结果是索引3

/*** 使用二分查找算法在一个有序数组中查找目标值的最左出现位置。* 如果找到目标值,则返回其最左索引;如果没有找到,则返回应插入的位置。** @param a 一个已经按升序排序的整型数组* @param target 需要在数组中查找的目标值* @return 如果找到目标值,则返回其在数组中最左边的索引;*         如果未找到,则返回目标值应插入的位置*/
public static int binarySearchLeftmost(int[] a, int target) {// 初始化两个指针 i 和 j,分别指向数组的起始位置和结束位置int i = 0, j = a.length - 1;// 当 i 小于等于 j 时继续循环while (i <= j) {// 计算中间点 m,使用无符号右移操作符 >>> 1 来避免可能的溢出问题int m = (i + j) >>> 1;// 如果目标值小于或等于中间点的值,则调整右边界 j 到 m - 1if (target <= a[m]) {j = m - 1;} // 否则,调整左边界 i 到 m + 1else {i = m + 1;}}// 返回 i,此时 i 是目标值应插入的位置或者目标值最左边出现的位置return i; 
}

查找最右侧的值

/*** 使用二分查找算法在一个有序数组中查找目标值的最右出现位置。* 如果找到目标值,则返回其最右索引;如果没有找到,则返回应插入的位置减一。** @param a 一个已经按升序排序的整型数组* @param target 需要在数组中查找的目标值* @return 如果找到目标值,则返回其在数组中最右边的索引;*         如果未找到,则返回目标值应插入的位置减一*/
public static int binarySearchRightmost(int[] a, int target) {// 初始化两个指针 i 和 j,分别指向数组的起始位置和结束位置int i = 0, j = a.length - 1;// 当 i 小于等于 j 时继续循环while (i <= j) {// 计算中间点 m,使用无符号右移操作符 >>> 1 来避免可能的溢出问题int m = (i + j) >>> 1;// 如果目标值小于中间点的值,则调整右边界 j 到 m - 1if (target < a[m]) {j = m - 1;} // 否则,调整左边界 i 到 m + 1else {i = m + 1;}}// 返回 i - 1,此时 i 是目标值应插入的位置,i - 1 是目标值最右边出现的位置return i - 1; 
}

二分查找-Leetcode 704

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1


示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
public static int binarySearchBalance(int[] a, int target) {int i = 0, j = a.length;while (1 < j - i) {int m = (i + j) >>> 1;if (target < a[m]) {j = m;} else {i = m;}}return (a[i] == target) ? i : -1;
}

搜索插入位置-Leetcode 35

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

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

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

示例 2:

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

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4
public int searchInsert(int[] a, int target) {int i = 0, j = a.length - 1;while(i <= j) {int m = (i + j) >>> 1;if(target <= a[m]) {j = m - 1;} else {i = m + 1;} }return i;
}

搜索开始结束位置-Leetcode 34

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

 

public static int left(int[] a, int target) {int i = 0, j = a.length - 1;int candidate = -1;while (i <= j) {int m = (i + j) >>> 1;if (target < a[m]) {j = m - 1;} else if (a[m] < target) {i = m + 1;} else {candidate = m;j = m - 1;}}return candidate;
}public static int right(int[] a, int target) {int i = 0, j = a.length - 1;int candidate = -1;while (i <= j) {int m = (i + j) >>> 1;if (target < a[m]) {j = m - 1;} else if (a[m] < target) {i = m + 1;} else {candidate = m;i = m + 1;}}return candidate;
}public static int[] searchRange(int[] nums, int target) {int x = left(nums, target);if(x == -1) {return new int[] {-1, -1};} else {return new int[] {x, right(nums, target)};}
}

 

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

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

相关文章

Spring Task之Cron表达式

&#x1f31f; Spring Task高能预警&#xff1a;你以为的Cron表达式可能都是错的&#xff01;【附实战避坑指南】 开篇暴击&#xff1a;为什么你的定时任务总在凌晨3点翻车&#xff1f; “明明设置了0 0 2 * * ?&#xff0c;为什么任务每天凌晨3点执行&#xff1f;” —— 来…

第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)

简单来说&#xff0c; Single Thread Execution就是采用排他式的操作保证在同一时刻只能有一个线程访问共享资源。 1.机场过安检 1.1非线程安全 先模拟一个非线程安全的安检口类&#xff0c;旅客(线程)分别手持登机牌和身份证接受工作人员的检查&#xff0c;示例代码如所示。…

OSPF基础(2):数据包详解

OSPF数据包(可抓包) OSPF报文直接封装在IP报文中&#xff0c;协议号89 头部数据包内容&#xff1a; 版本(Version):对于OSPFv2&#xff0c;该字段值恒为2(使用在IPV4中)&#xff1b;对于OSPFv3&#xff0c;该字段值恒为3(使用在IPV6中)。类型(Message Type):该OSPF报文的类型。…

MAC 安装mysql全过程记录

4.然后等待下载吧&#xff0c;&#xff08;下载中。。。。&#xff09;&#xff0c;好了&#xff0c;网速的问题&#xff0c;半个小时终于下载好了&#xff0c;开始安装吧。 5.得到如下安装包&#xff0c;mac下也是双击直接下载&#xff0c;来&#xff0c;我们来看看下载的过程…

神经网络常见激活函数 1-sigmoid函数

sigmoid 1 函数求导 sigmoid函数 σ ( x ) 1 1 e ( − x ) \sigma(x) \frac{1}{1e^{(-x)}} σ(x)1e(−x)1​ sigmoid函数求导 d d x σ ( x ) d d x ( 1 1 e − x ) e − x ( 1 e − x ) 2 ( 1 e − x ) − 1 ( 1 e − x ) 2 1 1 e − x − 1 ( 1 e − x ) 2 …

微软发布基于PostgreSQL的开源文档数据库平台DocumentDB

我们很高兴地宣布正式发布DocumentDB——一个开源文档数据库平台&#xff0c;以及基于 vCore、基于 PostgreSQL 构建的 Azure Cosmos DB for MongoDB 的引擎。 过去&#xff0c;NoSQL 数据库提供云专用解决方案&#xff0c;而没有通用的互操作性标准。这导致对可互操作、可移植…

【苍穹外卖 Day1】前后端搭建 Swagger导入接口文档

项目技术选型 前端 直接使用打包好的nginx运行。 后端 1、导入初始代码结构如下&#xff1a; 2、将代码上传远程仓库。 3、创建数据库&#xff0c;并修改数据库配置。 4、断点调试&#xff0c;前后端联调。 5、使用Nginx代理&#xff0c;修改Nginx配置 好处&#xff1a;提…

零基础Vue入门6——Vue router

本节重点&#xff1a; 路由定义路由跳转 前面几节学习的都是单页面的功能&#xff08;都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html&#xff09;&#xff0c;涉及到项目研发都是有很多页面的&#xff0c;这里就需要用到路由&#xff08;vue route…

深度学习里面的而优化函数 Adam,SGD,动量法,AdaGrad 等 | PyTorch 深度学习实战

前一篇文章&#xff0c;使用线性回归模型逼近目标模型 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 深度学习里面的而优化函数 …

mybatis-plus updateById源码

1.版本 : mybatis-plus-core 3.5.1 2.入口:MybatisPlusAutoConfiguration类sqlSessionFactory中的factory.getObject() 3.注入AbstractSqlInjector类中的inspectInject方法中 Overridepublic void inspectInject(MapperBuilderAssistant builderAssistant, Class<?> m…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)

文章目录 使用CLI管理RabbitMQrabbitmqctlrabbitmq-queuesrabbitmq-diagnosticsrabbitmq-pluginsrabbitmq-streamsrabbitmq-upgraderabbitmqadmin 使用CLI管理RabbitMQ RabbitMQ CLI 工具需要安装兼容的 Erlang/OTP版本。 这些工具假定系统区域设置为 UTF-8&#xff08;例如en…

PlanLLM: 首个支持开放词汇与封闭集任务的跨模态视频程序规划框架

2025年1月7号&#xff0c;由杨德杰、赵子敬、刘洋联合提出PlanLLM&#xff0c;一种基于可微调大型语言模型&#xff08;LLM&#xff09;的跨模态联合学习框架&#xff0c;用于解决视频程序规划任务。通过引入LLM增强规划模块和互信息最大化模块&#xff0c;PlanLLM突破了现有方…

WGCLOUD监控系统部署教程

官网地址&#xff1a;下载WGCLOUD安装包 - WGCLOUD官网 第一步、环境配置 #安装jdk 1、安装 EPEL 仓库&#xff1a; sudo yum install -y epel-release 2、安装 OpenJDK 11&#xff1a; sudo yum install java-11-openjdk-devel 3、如果成功&#xff0c;你可以通过运行 java …

6-图像金字塔与轮廓检测

文章目录 6.图像金字塔与轮廓检测(1)图像金字塔定义(2)金字塔制作方法(3)轮廓检测方法(4)轮廓特征与近似(5)模板匹配方法6.图像金字塔与轮廓检测 (1)图像金字塔定义 高斯金字塔拉普拉斯金字塔 高斯金字塔:向下采样方法(缩小) 高斯金字塔:向上采样方法(放大)…

DeepSeek-V3 与 DeepSeek R1 对比分析:技术与应用的全面解析

一、背景 在当今科技飞速发展的时代&#xff0c;深度学习技术如同一股强大的浪潮&#xff0c;席卷了自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;以及多模态模型等众多领域。从智能语音助手到图像识别技术&#xff0c;从文本生成工具到多模…

基于 Spring Cloud + Spring AI + VUE 的知识助理平台介绍以及问题

前言&#xff08;一些废话&#xff09; 在看这篇文章的各位大佬&#xff0c;感谢你们留出几分钟时间&#xff0c;来看这个产品介绍&#xff0c;其实重点说实话&#xff0c;不是这个产品怎么样。而是在最后有一个郁结在心里的几个问题&#xff0c;希望大佬们能给出一些建议。万…

IEEE 802.3/802.2 | LLC / SNAP

注&#xff1a;本文为 “IEEE 802.3/802.2 | LLC / SNAP” 相关文章合辑。 未整理去重。 第三篇部分内容出自第二篇。 802.2 协议 haoay321 2010-01-28 20:52:02 LLC 协议 LLC&#xff08;Logic Link Control&#xff0c;逻辑链路控制&#xff09;是 IEEE 802.2 协议中规定…

【Elasticsearch】Geo-distance聚合

geo_distance聚合的形状是圆形。它基于一个中心点&#xff08;origin&#xff09;和一系列距离范围来计算每个文档与中心点的距离&#xff0c;并将文档分配到相应的距离范围内。这种聚合方式本质上是以中心点为圆心&#xff0c;以指定的距离范围为半径的圆形区域来划分数据。 为…

Chapter 4-1. Troubleshooting Congestion in Fibre Channel Fabrics

This chapter covers the following topics: 本章包括以下内容: Congestion troubleshooting methodology and workflow. Hints and tips for troubleshooting congestion. Cisco MDS NX-OS commands for troubleshooting congestion. Case studies demonstrating troubleshoo…

【字节青训营-7】:初探 Kitex 字节微服务框架(使用ETCD进行服务注册与发现)

本文目录 一、Kitex概述二、第一个Kitex应用三、IDL四、服务注册与发现 一、Kitex概述 长话短说&#xff0c;就是字节跳动内部的 Golang 微服务 RPC 框架&#xff0c;具有高性能、强可扩展的特点&#xff0c;在字节内部已广泛使用。 如果对微服务性能有要求&#xff0c;又希望…