算法之二分查找

概述

二分查找算法的应用,包括有序和无序数据,有序数组默认按从小到大排序

在有序数组中找到num

/*** 4 二分查找 在有序数组中找到num* 思路:找中值,然后中值元素和目标值比较。如果中值元素比目标值大,则继续在左半区域查找。反之,右半区。重复该过程,直至找到目标值* @param arr 数组* @param num 目标值* @return 返回目标值的索引*/public static int binarySearch(int[] arr, int num){// 边界条件if(arr == null){return -1;}int l = 0;int r = arr.length-1;while(l <= r){int mid = l + (r-l)/2;if(arr[mid] == num){return mid;} else if (arr[mid] > num) {// 去左半区找r = mid - 1;} else{// 去右半区找l = mid + 1;}}return -1;}

在有序数组中找到最左边<=num的元素位置

/*** 5 二分查找,在有序数组中找到>=num最左的位置* 思路:在原来的二分查找基础上,找到处于最左位置的target。* 每次二分找到目标值时,用临时变量记录此时的索引。再查找左半区是否还有target,如果有,则更新临时变量。* @param arr 数组* @param num 目标值* @return 最左位置的索引*/public static int binarySearch2(int[] arr, int num){// 边界条件if(arr == null){return -1;}int l = 0;int r = arr.length-1;int ans = -1;while(l <= r){int mid = l + (r-l)/2;if(arr[mid] >= num){ans = mid;r = mid-1;}else{l = mid+1;}}return ans;}

在有序数组中找到最右边>=num的元素位置

    /*** 6 二分查找,在有序数组中找到<=num的最右边的位置* 思路:二分得到中值,如果中值元素<=目标值,则检查中值的右边是否还有满足<=目标值的元素。反之查中值的左边。* @param arr 数组* @param num 目标值* @return 目标值的索引*/public static int binarySearch3(int[] arr, int num){// 边界条件if(arr == null || arr.length == 1){return -1;}int l = 0;int r = arr.length-1;int ans = -1;while(l <= r){int mid = l + (r-l)/2;if(arr[mid] <= num){ans = mid;l = mid + 1;}else{r = mid - 1;}}return ans;}

logn时间复杂度的无序数组寻找局部最值

/*** 寻找峰值:<a href="https://leetcode.cn/problems/find-peak-element/description/">...</a>* 在无序,相邻元素不相等的列表中返回任一局部最小值* 思路:通过二分降低时间复杂度,提升效率。找到中值后,判断中值元素临近的mid-1、mid+1的关系。* 最值要么出现在数组两端,要么出现在中间。* 在无序数组中,找到中值后,如果arr[mid-1] < arr[mid] < arr[mid+1],那么在0-mid之间一定存在一个最小值。* 所以剩下就是二分找到这个最小值。* @author Kenyi*/
public class LocalMinValue {public static void main(String[] args) {int length = 9;int maxValue = 10;int testCycle = 100000;for (int i = 0; i < testCycle; i++) {int[] arr = randomArray(length, maxValue);int minIndex = binarySearchValleyElement(arr);if(!check(arr, minIndex)){System.out.println("出错了!");System.out.println("minIndex: " + minIndex);printArr(arr);}}}/*** 8 二分查找局部最小值算法* @param arr 数组* @return 目标值索引*/public static int binarySearchValleyElement(int[] arr){// 边界条件if(arr == null ){return -1;}int length = arr.length;if(length == 0){return -1;}if(length == 1){return 0;}if(arr[0] < arr[1]){return 0;}if(arr[length -1] < arr[length -2]){return length -1;}int left = 0;int right = length -1;while(left <= right){int mid = left + (right - left)/2;if(arr[mid-1] < arr[mid]){right = mid-1;} else if (arr[mid] > arr[mid+1]) {left = mid+1;}else{return mid;}}return -1;}/*** 返回数组任一的局部最大值* @param arr 数组* @return 局部最大值的索引*/public static int findPeakElement(int[] arr) {int n = arr.length;if (arr.length == 1) {return 0;}if (arr[0] > arr[1]) {return 0;}if (arr[n - 1] > arr[n - 2]) {return n - 1;}int l = 1, r = n - 2, m = 0, ans = -1;while (l <= r) {m = (l + r) / 2;if (arr[m - 1] > arr[m]) {r = m - 1;} else if (arr[m] < arr[m + 1]) {l = m + 1;} else {ans = m;break;}}return ans;}/*** 生成随机数组* @param length 数组长度* @param maxValue 元素最大值* @return 生成的数组*/public static int[] randomArray(int length, int maxValue){// 边界条件int[] arr = new int[length];if(length == 0){return arr;}arr[0] = (int)(Math.random() * maxValue);if(length == 1){return arr;}// 相邻元素互不相等for (int i = 1; i < length; i++) {do{arr[i] = (int)(Math.random() * maxValue);}while (arr[i] == arr[i-1]);}return arr;}/*** 检查是否是局部最小值* @param arr 数组* @param index 索引* @return 布尔值*/public static boolean check(int[] arr, int index){if(arr == null || arr.length == 0){return index == -1;}if(index == -1){for (int i = 1; i < arr.length-1; i++) {if(arr[i-1] > arr[i] && arr[i] < arr[i+1]){return false;}}return true;}int left = index-1;int right = index+1;boolean leftOk = left < 0 || arr[left] > arr[index];boolean rightOk = right > arr.length - 1 || arr[index] < arr[index + 1];return leftOk && rightOk;}/*** 打印数组* @param arr 数组*/public static void printArr(int[] arr){System.out.println(Arrays.toString(arr));}

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

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

相关文章

【Python实例】Python读取并绘制tif数据

【Python实例】Python读取并绘制tiff数据 Python实例-以全球不透水面积数据为例数据准备&#xff1a;全球不透水面积数据基于gdal库绘制tif图基于Rasterio库绘制tif图 参考 GeoTIff 是一个标准的.tif 文件或是一个图像文件格式&#xff0c;它包含了一些额外的空间信息&#xff…

prompt learning

prompt learning 对于CLIP&#xff08;如上图所示&#xff09;而言&#xff0c;对其prompt构造的更改就是在zero shot应用到下游任务的时候对其输入的label text进行一定的更改&#xff0c;比如将“A photo of a{obj}”改为“[V1][V2]…[Vn][Class]”这样可学习的V1-Vn的token…

业务开发常见问题-并发工具类

hello&#xff0c;大家好&#xff0c;本讲我们一起聊一下常见的几个并发工具类的使用和坑&#xff01; 在日常工作中&#xff0c;我们经常会遇到多线程并发问题&#xff0c;比如ThreadLocal、锁、ConcurrentHashMap、CopyOnWriteArrayList等。那么如何正常的使用呢&#xff1f;…

【最新通知】2024年Cisco思科认证CCNA详解

CCNA现在涵盖安全性、自动化和可编程性。该计划拥有一项涵盖IT职业基础知识的认证&#xff0c;包括一门考试和一门培训课程&#xff0c;助您做好准备。 CCNA培训课程和考试最近面向最新技术和工作岗位进行了重新调整&#xff0c;为您提供了向任何方向发展事业所需的基础。CCNA认…

blender分离含有多个动作的模型,并导出含有材质的fbx模型

问题背景 笔者是模型小白&#xff0c;需要将网络上下载的fbx模型中的动作&#xff0c;分离成单独的动作模型&#xff0c;经过3天摸爬滚打&#xff0c;先后使用了blender&#xff0c;3d max&#xff0c;unity&#xff0c;最终用blender完成&#xff0c;期间参考了众多网络上大佬…

【Ansiable】ansible的模块和主机清单

目录 一、介绍一些运维自动化工具 二、Ansible 概述/简介 三、Ansible 工作机制 3.1 内部工作机制 3.2 外部工作机制 四、Ansible 执行流程 五、Ansblie 安装以及日常操作模块***** 5.1 ansible 环境安装部署 5.2 ansible 命令行模块 5.2.1 command 模块 5.2.2 shel…

明源云ERP报表服务GetErpConfig.aspx接口存在敏感信息泄露

一、漏洞简介 在访问 /service/Mysoft.Report.Web.Service.Base/GetErpConfig.aspx?erpKeyerp60 路径时&#xff0c;返回了包含敏感信息的响应。这些信息包括但不限于数据库连接字符串、用户名、密码、加密密钥等。这些敏感信息的暴露可能导致以下风险&#xff1a;数据库访问…

【IPv6】IPv6 NAT66介绍

参考链接 IPv6-to-IPv6 Network Address Translation (NAT66) (ietf.org)https://datatracker.ietf.org/doc/id/draft-mrw-nat66-00.html IPv6 NAT66 NAT66&#xff0c;全称为Network Address Translation for IPv6 to IPv6&#xff0c;是一种用于IPv6网络的地址转换技术。在…

Tkinter -- python GUI学习与使用

前言 python GUI 目前pythonGUI有很多&#xff0c;哪一个最好&#xff1f; 先说说我选择的思路&#xff0c;我的目的是开发一个易用的软件&#xff0c;最重要的是稳定&#xff0c;并且碰到问题能够解决&#xff0c;因此&#xff0c;我的目标很明确&#xff0c;有比较大的用户群…

基于Python的自然语言处理系列(39):Huggingface中的解码策略

在自然语言生成任务中&#xff0c;如何选择下一步的单词或者词语对生成的文本质量影响巨大。Huggingface 提供了多种解码策略&#xff0c;可以在不同的场景下平衡流畅度、创造力以及生成效率。在这篇文章中&#xff0c;我们将逐步介绍 Huggingface 中的几种常见解码策略&#x…

web API基础

作用和分类 作用: 就是使用 JS 去操作 html 和浏览器 分类&#xff1a; DOM (文档对象模型)、 BOM &#xff08;浏览器对象模型&#xff09; 什么是DOM DOM (Document Object Model) 译为文档对象模型&#xff0c;是 HTML 和 XML 文档的编程接口。 HTML DOM 定义了访问和操作 …

mingw64的Windows安装及配置教程gcc、g++等

mingw64.rar 链接&#xff1a;https://pan.baidu.com/s/18YrDRyi5NHtqnTwhJG6PuA 提取码&#xff1a;pbli &#xff08;免费永久有效&#xff0c;免安装&#xff0c;解压后配置环境变量即可使用&#xff09; 1 下载 解压后随便放到一个地方&#xff1a; 复制“bin”路径&am…

重磅:中国首个SVG技术标准发布,计育韬老师主笔起草

编辑搜图 中华人民共和国《融媒体 SVG 交互设计技术规范》是由复旦大学奇点新媒体研究中心等单位牵头&#xff0c;学科带头人计育韬等人主要起草&#xff0c;并于 2024 年 8 月起面向全社会行业从业者发布的最高技术标准。该标准前身为 2016 年计育韬与微信团队合作拟定的《SV…

置分辨率设置多显示器的时候提示, 某些设置由系统管理员进行管理

遇到的问题 设置分辨率设置多显示器的时候提示&#xff08;如下图所示&#xff09;&#xff1a; 某些设置由系统管理员进行管理 解决方法 先试试这个方法&#xff1a; https://answers.microsoft.com/zh-hans/windows/forum/all/%E6%9B%B4%E6%94%B9%E5%88%86%E8%BE%A8%E7%8…

强大的Python必备库,你知道几个?建议收藏!

在Python的世界里&#xff0c;库的丰富性让开发者的工作变得轻松而高效。那么&#xff0c;你知道哪些强大的Python必备库吗&#xff1f; 面对众多的Python库&#xff0c;如何选择适合自己的工具来提升开发效率和代码质量&#xff1f;&#xff0c;丰富多样的库如同一个个强大的…

AnaTraf | 提升网络性能:深入解析网络关键指标监控、TCP重传与TCP握手时间

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 在当今的数字化时代&#xff0c;网络的稳定性和性能对企业的运营效率至关重要。无论是内部通信、应用程序的运行&#xff0c;还是对外提供服务&#xff0c;网络都发挥着关键作用。对于网络工程师或IT运维人员…

EasyX图形库的安装

前言 EasyX是一个图形库&#xff0c;可以用来做一些c/c小游戏&#xff0c;帮助学习。 一、进入EasyX官网 https://easyx.cn/ 二、点击下载EasyX 三、下载好后以管理员身份运行它 四、点击下一步 五、然后它会自动检测你的编辑器&#xff0c;用哪个就在哪个点安装 六、安装成功…

【linux问题】Linux命令行终端窗口的输出,显示不全问题

Linux命令行终端窗口的输出&#xff0c;显示不全问题 问题&#xff1a; 图中显示的是一个Linux命令行终端窗口&#xff0c; nmcli dev wifi 是一个命令——列出所有能用的Wi-Fi。 执行命令后&#xff0c;窗口输出了显示了所有能用的Wi-Fi网络列表。 但是在每一行末尾有一个“…

KPaaS:基于微服务架构的低代码平台

基于微服务架构的低代码平台是当前企业数字化转型的重要工具。通过将微服务架构与低代码平台结合&#xff0c;可以实现高效、灵活且可扩展的应用开发。在当今数字化转型的浪潮中&#xff0c;企业面临着诸多挑战&#xff0c;其中IT资源有限以及对高效开发的需求尤为突出。KPaaS业…

AI一键生成钢铁是怎样炼成的ppt!用这2个工具轻松拿捏ppt制作!

钢铁是怎样炼成的&#xff0c;是中小学语文新课标必读书目&#xff0c;它是由前苏联作家尼古拉奥斯特洛夫斯基于1930年至1934年写成的半自传体长篇小说&#xff0c;全书详细记叙了保尔柯察金于20世纪初期的成长历程。 对于每个接受过九年义务教育的大小朋友来说&#xff0c;这…