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

【算法】递归实现二分查找(优化)以及非递归实现二分查找

递归实现二分查找 
思路分析

1.首先确定该数组中间的下标 mid = (left + right) / 2;

2.然后让需要查找的数 findVal 和 arr[mid] 比较

  1. findVal > arr[mid],说明要查找的数在 arr[mid] 右边,需要向右递归
  2. findVal < arr[mid],说明要查找的数在 arr[mid] 左边,需要向左递归
  3. findVal == arr[mid],说明找到,返回

什么时候结束递归

1.找到就结束递归

2.递归完整个数组,依然没有找到,即 left > right 就阶结束递归

//注意:使用二分查找的前提是该数组是有序的
public class BinarySearch {public static void main(String[] args) {int[] arr = {-3, 1, 18, 99, 1000, 1024};int findVal = 99;int index = binarySearch(arr, 0, arr.length - 1, findVal);System.out.printf("%d的索引为%d\n", findVal, index);}//二分查找算法public static int binarySearch(int[] arr, int left, int right, int findVal) {//如果找不到,返回 -1if (left > right) {return -1;}int mid = (left + right) / 2;int midVal = arr[mid];if (findVal > midVal) {return binarySearch(arr, mid + 1, right, findVal);}else if (findVal < midVal) {return binarySearch(arr, left, mid - 1, findVal);} else {return mid;}}
}
优化

当一个有序数组中有多个相同数值时,如{-3, 1, 18, 99,99, 1000, 1024},如何将所有数值都查找到,比如这里的 99

思路分析

1.在找到 mid 值,不要马上返回

2.向 mid 索引值的左边扫描,将所有满足的下标加入集合 ArrayList

3.向 mid 索引值的右边扫描,将所有满足的下标加入集合 ArrayList

4.将 ArrayList 返回

//注意:使用二分查找的前提是该数组是有序的
public class BinarySearch {public static void main(String[] args) {int[] arr = {-3, 1, 18, 99, 99, 99, 1000, 1024};int findVal = 99;ArrayList<Integer> resIndexList = binarySearch(arr, 0, arr.length - 1, findVal);System.out.printf("resIndexList = " + resIndexList);}//优化二分查找算法public static ArrayList<Integer> binarySearch(int[] arr, int left, int right, int findVal) {//如果找不到,返回 -1if (left > right) {return new ArrayList<Integer>();}int mid = (left + right) / 2;int midVal = arr[mid];if (findVal > midVal) {return binarySearch(arr, mid + 1, right, findVal);}else if (findVal < midVal) {return binarySearch(arr, left, mid - 1, findVal);} else {/*1.在找到 mid 值,不要马上返回2.向 mid 索引值的左边扫描,将所有满足的下标加入集合 ArrayList3.向 mid 索引值的右边扫描,将所有满足的下标加入集合 ArrayList4.将 ArrayList 返回*/ArrayList<Integer> resIndexlist = new ArrayList<>();//向左扫描int temp = mid - 1;while (true) {if (temp < 0 || arr[temp] != findVal) {  //退出break;}//否则,就将 temp 放入到 resIndexlistresIndexlist.add(temp);temp -= 1;  //temp 左移}resIndexlist.add(mid);//向右扫描temp = mid + 1;while (true) {if (temp > arr.length - 1 || arr[temp] != findVal) {  //退出break;}//否则,就将 temp 放入到 resIndexlistresIndexlist.add(temp);temp += 1;  //temp 左移}return resIndexlist;}}
}

非递归实现二分查找
public class BinarySearchNoRecursion {public static void main(String[] args) {int[] arr = {1, 2, 8, 999, 1024, 1234};int target = 8;System.out.println("待查询数组为:" + Arrays.toString(arr));System.out.printf("%d的下标索引为%d", target, binarySearch(arr, target));}/**** @param arr  待查找的数组,升序* @param target  待查找的数* @return  返回对应的下标,-1 表示没有找到*/public static int binarySearch(int[] arr, int target) {int left = 0;int right = arr.length - 1;while (left <= right) {  //说明可以继续查找int mid = (left + right) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] > target) {right = mid - 1;} else {left = mid + 1;}}return -1;}
}

相关文章:

【算法】递归实现二分查找(优化)以及非递归实现二分查找

递归实现二分查找 思路分析 1.首先确定该数组中间的下标 mid (left right) / 2; 2.然后让需要查找的数 findVal 和 arr[mid] 比较 findVal > arr[mid]&#xff0c;说明要查找的数在 arr[mid] 右边&#xff0c;需要向右递归findVal < arr[mid]&#xff0c;说明要查…...

CDN 是什么?

CDN是一种分布式网络服务&#xff0c;通过将内容存储在分布式的服务器上&#xff0c;使用户可以从距离较近的服务器获取所需的内容&#xff0c;从而加速互联网上的内容传输。 就近访问&#xff1a;CDN 在全球范围内部署了多个服务器节点&#xff0c;用户的请求会被路由到距离最…...

索引:SpringCloudAlibaba分布式组件全部框架笔记

索引&#xff1a;SpringCloudAlibaba分布式组件全部框架笔记 一推荐一套分布式微服务的版本管理父工程pom模板&#xff1a;Springcloud、SpringCloudAlibaba、Springboot二SpringBoot、SpringCloud、SpringCloudAlibaba等各种组件的版本匹配图&#xff1a;三SpringBoot 3.x.x版…...

2024第五届华数杯数学建模竞赛C题思路+代码

目录 原题背景背景分析 问题一原题思路Step1:数据读取与处理Step2:计算最高评分&#xff08;Best Score, BS&#xff09;Step3:统计各城市的最高评分&#xff08;BS&#xff09;景点数量 程序读取数据数据预处理 问题二原题思路Step1: 定义评价指标Step2: 收集数据Step3: 标准化…...

FFmpeg源码:av_reduce函数分析

AVRational结构体和其相关的函数分析&#xff1a; FFmpeg有理数相关的源码&#xff1a;AVRational结构体和其相关的函数分析 FFmpeg源码&#xff1a;av_reduce函数分析 一、av_reduce函数的声明 av_reduce函数声明在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为7.0…...

nginx: [error] open() “/run/nginx.pid“ failed (2: No such file or directory)

今天 准备访问下Nginx服务&#xff0c;但是 启动时出现如下报错&#xff1a;&#xff08;80端口被占用&#xff0c;没有找到nginx.pid文件&#xff09; 解决思路&#xff1a; 1、 查看下排查下nginx服务 #确认下nginx状态 ps -ef|grep nginx systemctl status nginx#查看端口…...

<数据集>BDD100K人车识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;15807张 标注数量(xml文件个数)&#xff1a;15807 标注数量(txt文件个数)&#xff1a;15807 标注类别数&#xff1a;7 标注类别名称&#xff1a; [pedestrian, car, bus, rider, motorcycle, truck, bicycle] 序号…...

利用SSE打造极简web聊天室

在B/S场景中&#xff0c;通常我们前端主动访问后端可以使用axios&#xff0c;效果很理想&#xff0c;而后端要访问前端则不能这样操作了&#xff0c;可以考虑SSE、websocket等方式&#xff0c;实时和性能均有保障。 下面给出一个简单的SSE例子&#xff0c;后端是nodeexpress&am…...

代码随想录第二十天|动态规划(4)

目录 LeetCode 322. 零钱兑换 LeetCode 279. 完全平方数 LeetCode 139. 单词拆分 总结 LeetCode 322. 零钱兑换 题目链接&#xff1a;LeetCode 322. 零钱兑换 思想&#xff1a;首先定义dp数组的含义&#xff0c;dp[j]即总金额为j的情况下所需的最少的硬币个数。接下来确定…...

TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

目录 TreeSize&#xff1a;免费的磁盘清理与管理神器&#xff0c;解决C盘爆满的燃眉之急 一、TreeSize介绍 二、下载安装TreeSize 2.1、下载地址 2.2、下载步骤 ​2.3、安装步骤 三、professional版的TreeSize试用 3.1、分析磁盘空间 3.2、显示拓展名统计信息 3.3、显…...

如何建立自己的技术知识体系

已经工作五年了&#xff0c;慢慢的觉得不能再继续像以前一样&#xff0c;工作中用到啥才去学啥&#xff0c;平时积累的知识也是非常的零碎&#xff0c;我现在要做的就是建立自己的技术知识体系。 我感觉学习技术知识就想是探索一个城市一样&#xff0c;技术知识体系就好比是这…...

JS优化了4个自定义倒计时

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>4个自定义倒计时</title><style>* {margin: 0;padding: 0;box-sizing: border-box;user-select: none;body {background: #0b1b2c;}}hea…...

模型实战(25)之 基于LoFTR深度学习匹配算法实现图像拼接

模型实战(25)之 基于LoFTR深度学习匹配算法实现图像拼接 图像拼接在全景图、大图或者多目场景下经常会被使用,常用的方法有传统图像处理算法和深度学习直接获取对应点的算法传统图像处理算法过程繁琐,阈值少且整体算法结果对调参比较敏感,其主要通过形状、特征点等描述子对…...

计算机毕业设计Python+Spark知识图谱高考志愿推荐系统 高考数据分析 高考可视化 高考大数据 大数据毕业设计

《Spark高考推荐系统》开题报告 一、选题背景及意义 1. 选题背景 随着我国高考制度的不断完善和大数据技术的飞速发展&#xff0c;高考志愿填报已成为考生和家长高度关注的重要环节。传统的志愿填报方式依赖于考生和家长手动查找和对比各种信息&#xff0c;不仅效率低下且容…...

【python】文件

在python中可以通过文件操作&#xff0c;将数据保存到计算机硬盘中文件&#xff0c;可以包含文本数据&#xff0c;也可以包含二进制数据(图片&#xff0c;视频&#xff0c;音频等)。 目录 前言 正文 一、基本语法 1、函数open()打开file 返回一个文件对象 1.1、文件路径 1&a…...

《Attention Is All You Need》核心观点及概念

这个文件据说是一篇很厉害的AI论文,https://arxiv.org/pdf/1706.03762 这篇论文《Attention Is All You Need》确实是AI领域中的一个里程碑,它改变了我们处理语言的方式。 下面小编会用简单的语言来解释这篇文章的核心观点和学术概念,并告诉大家它为什么很厉害。 核心观点…...

【中项】系统集成项目管理工程师-第9章 项目管理概论-9.9价值交付系统

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…...

JS+H5美观的带搜索的博客文章列表(可搜索多个参数)

实现 美观的界面&#xff08;电脑、手机端界面正常使用&#xff09;多参数搜索&#xff08;文章标题&#xff0c;文章简介&#xff0c;文章发布时间等&#xff09;文章链接跳转 效果图 手机端 电脑端 搜索实现 搜索功能实现解释 定义文章数据: 文章数据保存在一个 JavaScri…...

牛客周赛 Round 54 (c++题解)

比赛地址 : 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A 输出o的个数&#xff1b; #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \n using namespace std; typedef long long LL;inlin…...

htsjdk库Genotype及相关类介绍

在 HTSJDK 库中,处理基因型的主要类包括 Genotype、FastGenotype、GenotypeBuilder 以及相关的类和接口。以下是这些类和接口的详细介绍: Genotype 类 主要功能 表示基因型:Genotype 类用于表示个体在特定变异位置上的基因型。基因型是对个体在变异位置上的等位基因组合的…...

告别直播回放获取难题!用douyin-downloader实现高效内容管理的3个创新方法

告别直播回放获取难题&#xff01;用douyin-downloader实现高效内容管理的3个创新方法 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and bro…...

如何在5分钟内免费激活Windows和Office?KMS_VL_ALL_AIO智能脚本终极指南

如何在5分钟内免费激活Windows和Office&#xff1f;KMS_VL_ALL_AIO智能脚本终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活和Office办公软件激活而烦恼吗&#x…...

缺失值处理失效、类型推断崩塌、内存暴增…Polars 2.0清洗故障全解析,深度解读Arrow底层Schema约束机制

第一章&#xff1a;Polars 2.0数据清洗的核心挑战与演进脉络随着数据规模持续膨胀与实时分析需求激增&#xff0c;传统基于 Pandas 的数据清洗范式在内存效率、并行粒度和类型安全方面日益显露瓶颈。Polars 2.0 的发布并非简单功能叠加&#xff0c;而是以 Arrow-native 执行引擎…...

如何通过LeaguePrank实现游戏界面个性化:打造独特的英雄联盟视觉体验

如何通过LeaguePrank实现游戏界面个性化&#xff1a;打造独特的英雄联盟视觉体验 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank LeaguePrank是一款专注于英雄联盟客户端界面自定义的开源工具&#xff0c;它通过安全的官方LCU…...

Qwen3.5-9B效果展示:128K长文档摘要+复杂代码生成真实案例集

Qwen3.5-9B效果展示&#xff1a;128K长文档摘要复杂代码生成真实案例集 1. 模型核心能力概览 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型&#xff0c;在多个专业领域展现出卓越的性能。这个模型最令人印象深刻的是它处理复杂任务的能力&#xff0c;就像一位经验丰富的工程…...

【RT-DETR涨点改进】SCI一区 2025顶刊 |全网独家创新,注意力改进篇 | RT-DETR引入DOAM动态全向注意力模块,模块,显著增强了特征表达能力和结构恢复能力,含7种独家创新改进点

一、本文介绍 🔥本文给大家介绍利用 DOAM 动态全向注意力模块改进RT-DETR网络模型,可在不显著增加计算量的前提下增强全局上下文建模能力,通过空间轴向聚合获得更强的跨区域信息交互,并用通道动态加权突出目标相关特征、抑制背景干扰,从而优化多尺度特征融合效果,提升小…...

Movie_Recommend推荐算法对比:ALS、ItemCF与热门推荐全面解析

Movie_Recommend推荐算法对比&#xff1a;ALS、ItemCF与热门推荐全面解析 【免费下载链接】Movie_Recommend 基于Spark的电影推荐系统&#xff0c;包含爬虫项目、web网站、后台管理系统以及spark推荐系统 项目地址: https://gitcode.com/gh_mirrors/mo/Movie_Recommend …...

2.2.2.2 使用Spark单机版环境

本次实战深入探索Spark单机版环境的核心功能。首先运行SparkPi示例程序计算圆周率&#xff0c;验证集群计算能力&#xff1b;随后启动spark-shell进入交互式环境&#xff0c;完成等差数列求和、九九乘法表打印等基础任务。重点通过Scala代码操作RDD&#xff0c;演示了从文本文件…...

Elixir Plug安全防护:CSRF保护、SSL强制与基础认证的终极教程

Elixir Plug安全防护&#xff1a;CSRF保护、SSL强制与基础认证的终极教程 【免费下载链接】plug Compose web applications with functions 项目地址: https://gitcode.com/gh_mirrors/pl/plug Elixir Plug 是一个强大的 Web 应用构建工具&#xff0c;提供了全面的安全防…...

倒反天罡了!Cursor自研模型反超Opus 4.6!价格脚踝斩,氛围编程沸腾了

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里0、2T架构师学习资料干货分上一篇&#xff1a;2T架构师学习资料干货分享大家好&#xff0c;我是互联网架构师&#xff…...