自学算法:02 二分搜索

题目:

1. 在有序数组中确定num存在还是不存在。

2. 在有序数组中找>=num的最左位置。

3. 在有序数组中找<=num的最右位置。

4. 二分搜索不一定发生在有序数组上(比如寻找峰值问题)。

5. 二分答案法。

题目一

简单的二分搜索法。

public static boolean exist(int[] arr, int num) {if(arr == null || arr.length == 0) return false;int l = 0, r = arr.length - 1;while(l <= r) {int mid = (l + r) / 2;if(arr[mid] == num) {return true;} else if (arr[mid] < num) {l = mid + 1;} else {r = mid - 1;}}return false;}

题目二

还是很简单。

public static int exist(int[] arr, int num) {if(arr == null || arr.length == 0) return -1;int l = 0, r = arr.length - 1;int res = -1;while(l <= r) {
//			int mid = (l + r) / 2; // 防止数组长度过长,溢出int mid = l + ((r - l) >> 1);if(arr[mid] >= num) {res = mid;r = mid - 1;} else {l = mid + 1;}}return res;}

题目三

和上一题一致。

public static int exist(int[] arr, int num) {if(arr == null || arr.length == 0) return -1;int l = 0, r = arr.length - 1;int res = -1;while(l <= r) {
//			int mid = (l + r) / 2; // 防止数组长度过长,溢出int mid = l + ((r - l) >> 1);if(arr[mid] <= num) {res = mid;l = mid + 1;} else {r = mid - 1;}}return res;}

题目四

题目中规定相邻两数不相等,且默认超出界限的值为无穷小,题目可能存在多个峰值,只需返回一个即可。要注意的是如果0位置和(size - 1)位置不满足峰值(也就是0处小于1处的值,(size - 1)处小于(size - 2)处的值),就意味着中间一定存在峰值,也就是起始位置单调递增,末尾位置单调递减,故而中间(也就是[1,(size - 2)]区间)必然存在极值。于是可以再找中间的值来判定是否满足峰值,如果它小于左边的值,那就意味着峰值在左边区间,如果大于右边的值,就在右边的区间找,如果是极小值,只需要在两个区间中随便选一个找即可。依据这个原理可以不断缩小要判断的范围,这也就是能使用二分法的原因。

public int findPeakElement(int[] arr) {if(arr == null || arr.length == 0) return -1;if(arr.length == 1) return 0;int l = 0, r = arr.length - 1;if(arr[l] > arr[l + 1]) return l;l ++;if(arr[r] > arr[r - 1]) return r;r --;while(l <= r) {
//			int mid = (l + r) / 2; // 防止数组长度过长,溢出int mid = l + ((r - l) >> 1);if(arr[mid - 1] > arr[mid]) {r = mid - 1;} else if(arr[mid + 1] > arr[mid]) {l = mid + 1;} else {return mid;}}return -1;}

总结:无论整体是否有序,只要确定判定完中间值之后,可以进而确定哪一侧必然存在要找的值(或者某侧必然不存在要找的值),也就是缩小一半的寻找范围,就可以使用二分搜索法。

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

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

相关文章

MC0207 中转站

物流业为了降低物流成本&#xff0c;提高物流效率&#xff0c;运输过程中通常不会由始发地直达目的地&#xff0c;而是经由多个中转站中转&#xff0c;最终到达目的地。最常见的便是快递业&#xff0c;由于中转站有很多&#xff0c;要想将所有中转站两两互通代价过高&#xff0…

Web 常见的攻击方式有哪些?

常见的 Web 攻击方式有以下几种&#xff1a; 跨站脚本攻击&#xff08;XSS 攻击&#xff09; 跨站请求伪造&#xff08;XSRF 攻击&#xff09; SQL 注入 XSS 攻击 MDN 定义如下&#xff1a; 跨站脚本攻击&#xff08;Cross-site scripting&#xff0c;XSS&#xff09;是一…

【每周赠书活动第1期】Python编程 从入门到实践 第3版(图灵出品)

编辑推荐 适读人群 &#xff1a;本书适合对Python感兴趣的所有读者阅读。 编程入门就选蟒蛇书&#xff01; 【经典】Python入门经典&#xff0c;常居Amazon等编程类图书TOP榜 【畅销】热销全球&#xff0c;以12个语种发行&#xff0c;影响超过 250 万读者 【口碑】好评如潮…

手撕算法-删除有序数组中的重复项 II

描述 例如&#xff1a;输入&#xff1a;nums [1,1,1,2,2,3]输出&#xff1a;5, nums [1,1,2,2,3]解释&#xff1a;函数应返回新长度 length 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。 分析 双指针, fast, slow。nums[…

Python并发编程:线程和多线程的使用

前面的文章&#xff0c;我们讲了什么Python的许多基础知识&#xff0c;现在我们开始对Python并发编程进行学习。我们将探讨 Python 中线程和多线程的使用。帮助大家更好地理解如何使用这种技术。 目录 1. 线程&#xff08;Threads&#xff09; 1.1 Python 中的线程工作原理 …

Andorid项目源码 仿ios音量调节的效果 (内附源码下载)

下载地址&#xff1a; https://download.csdn.net/download/Nekosann/89026144 这段代码是Android应用程序的一部分&#xff0c;主要实现了一个仿iOS风格的音量调节效果。具体来说&#xff0c;它使用了一个自定义的评分条&#xff08;RatingBar&#xff09;&#xff0c;允许用…

CSP-S 真题:格雷码

原文链接&#xff1a;CSP-S 真题第二讲&#xff1a;格雷码 说明&#xff1a;CSDN和公众号文章同步发布&#xff0c;需要第一时间收到最新内容&#xff0c;请关注公众号【比特正传】。 一、题目背景 题目来源&#xff1a;CSP-S 2019年 T1 题目考察点&#xff1a;递归、搜索 …

C语言:实现使用malloc函数模拟开辟一个二维数组

目录 解题思路 步骤一&#xff1a;开辟空间 步骤二&#xff1a;使用空间 步骤三&#xff1a;释放空间 图解 完整代码展示&#xff1a;注意看注释 在C语言编程中&#xff0c;处理多维数据结构时&#xff0c;我们通常会遇到二维数组。然而&#xff0c;对于特定大小或需要动…

Java秘笈

一、缩略 二、详版 【CDN分发】||----【跳板机】---SSH&#xff1a;(^_^) 管理员/运维Iptables【防火墙】要求&#xff1a;HA||----【等保系统】||----【蜜罐系统】【反向代理】Nginx/Lvs【静态服务器】【边际路由】要求&#xff1a;HA||Gateway/Zull【Api网关】要求&#xff1…

2023年12月青少年软件编程C语言一级真题答案——持续更新.....

一、数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分别为保留2位小数输出的F,以及整数N,以…

JS精度计算的几种解决方法,1、转换成整数计算后再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、转换成整数计算后再转换成小数二、toFixed三、math.js四、bignumber.js五、big.js总结 前言 原始计算 let aNum 6.6 0.3;let bNum 6.6 - 0.2;let cNum 6.6 * 0.3;let dNum 6.6 / 0.2;console.log(…

悦数图数据库推出 AI 知识图谱构建器及图语言生成助手

简介&#xff1a; 随着人工智能应用在全球范围的普及和风靡&#xff0c;大语言模型技术&#xff08;Large Language Model&#xff0c;简称 LLM&#xff09;受到了广泛的关注和应用。而图数据库作为一种处理复杂数据结构的工具&#xff0c;能够为企业构建行业大语言模型提供强大…

Linux之基础IO

1.C语言中的文件操作函数 文件的打开 path为文件路径&#xff0c;mode为打开方式&#xff0c;它们都是字符串。 代码演示&#xff1a; 此时&#xff0c;当前目录中并没有log.txt文件&#xff0c;但是没关系&#xff0c;fopen会在当前路径下创建log.txt文件。 简单来说&#xf…

分享 | 使用Virtuoso VCPVSR工具基于标准单元的布局布线流程

​ 本节内容 导览 一、准备工作 二、运行VCP前的配置 三、VCP的布局规划 四、VCP的自动摆放 五、VSR的自动绕线 分享使用Virtuoso GXL Custom Digital Placer(VCP) & Space-based Router(VSR)工具进行基于纯数字Standard-Cell布局布线的操作流程。 VCP&VSR演…

【MySQL】2.MySQL数据库的基本操作

目录 数据库基本操作 查看数据库信息 查看数据库结构 显示数据表的结构&#xff08;字段&#xff09; 常用的数据类型 数据库管理操作 SQL语句概述 SQL分类 1.DDL&#xff1a;数据定义语言 1.1创建数据库和表 创建数据库 创建数据表 1.2删除数据库和表 删除数据表…

【数字图像处理matlab系列】使用数组索引进行简单的图像裁剪、二次取样操作

【数字图像处理matlab系列】使用数组索引进行简单的图像裁剪、二次取样操作 【先赞后看养成习惯】求点赞+关注+收藏! pout.tif是一张matlab自带的图片,图像尺寸是291*240,使用imread读取该图像>> a = imread(pout.tif); >> imshow(a);对图像a进行上下翻转操作,…

求解三维空间中两线段之间的最小距离,并求出最小距离对应的两个点

原理解析几何通用解法&#xff1a; 在空间中两条线上最短距离处的点连垂直于两条线L1、L2 算法描述&#xff1a;设两条无限长度直线s、t,起点为s0、t0&#xff0c;方向向量为u、v 1、最短直线两点&#xff1a;在s上为s0 sc*u&#xff0c;在t上的为t0 tc*v 2、…

国务院办公厅发布:政府类网站网页设计规范(试行)

国务院办公厅于2019年12月发布了《政府类网站网页设计规范&#xff08;试行&#xff09;》。该规范的发布旨在统一政府类网站的设计风格和标准&#xff0c;提升政府网站的用户体验和可访问性&#xff0c;推动政府信息公开和服务的提升。 该规范涵盖了政府类网站的各个方面&…

C语言——编程世界的璀璨明珠

在编程世界中&#xff0c;C语言犹如一颗璀璨的明珠&#xff0c;以其独特的魅力和强大的功能赢得了全球开发者的青睐。自诞生以来&#xff0c;C语言在计算机科学领域一直占据着举足轻重的地位&#xff0c;被誉为编程语言的奠基者之一。本文将从多个方面详细介绍C语言的卓越之处&…

使用Qt自带windeployqt打包QML的exe

1.在开始菜单输入CMD找到对应的Qt开发版本&#xff0c;我的是Qt5.15.2(MinGW 8.1.0 64-bit)。 2.在控制台输入如下字符串&#xff0c;格式为 windeployqt exe绝对路径 --qmldir 工程的绝对路径 如下是我的打包代码。 我需要打包的exe的绝对路径 D:\Prj\Code\Demo\QML\Ana…