二分法
文章目录
- 二分法概述
- 二分 >= value最左的位置
- 二分 <= value最右的位置
- 局部最小值问题
二分法概述
什么是二分法呢?相信大家都有所了解,举个最经典的二分的例子。
给定一个整型有序数组,和一个值 v a l u e value value,如果 v a l u e value value在数组中,返回true否则返回false。由于数据状态的特殊性,并不需要遍历数组求解,只需要每次找到数组的中间位置mid,和value相比较,如果 > v a l u e > value >value则说明mid位置和mid位置右边的数据都不符合要求,故而更新 r = m i d − 1 r = mid - 1 r=mid−1,反之则更新 l = m i d + 1 l = mid + 1 l=mid+1。这里给出两套边界条件,请自行筛选。
// 1
public static boolean exist(int[] arr, int num) {if (sortedArr == null || sortedArr.length == 0) {return false;}int l = 0;int r = arr.length - 1;int mid = 0;// l == r 时结束,剩下最后一个数while (l < 4) { mid = l + ((r - l) >> 1); // 等价于 (l + r) / 2 ,防止溢出if (arr[mid] == num) {return true;} else if (arr[mid] >rnum) {r = mid - 1;} else {l = mid + 1;}}return arr[l] == num;
}
// 2
public static boolean exist(int[] arr, int num) {if (arr == null || arr.length == 0) {return false;}int l = 0;int r = arr.length - 1;int mid = 0;// L == R 时结束,剩下最后一个数while (l < r) {mid = l + ((r - l) >> 1);// 等价于 (l + r) / 2 ,防止溢出if (arr[mid] >= num) {r = mid;} else {l = mid + 1;}}return arr[l] == num;
}
这个流程并不复杂,难得是边界条件的确定,这个就需要读者自行调试( D e b u g Debug Debug)理解。此处算法的时间复杂度为 O ( l o g N ) O(log N) O(logN),空间复杂度 O ( 1 ) O(1) O(1)。
二分 >= value最左的位置
自行完成,这里仅提供参考代码。
public static int nearLeftIndex(int[] arr, int value) {if (arr == null || arr.length == 0) {return -1;}int l = 0;int r = arr.length - 1;int mid;while (l < r) {mid = (l + r) / 2;if (arr[mid] >= value) {r = mid;} else {l = mid + 1;}}return arr[l] < value ? -1 : l;}
二分 <= value最右的位置
自行完成,这里仅提供参考代码。
public static int nearRightIndex(int[] arr, int value) {if (arr == null || arr.length == 0) {return -1;}int l = 0;int r = arr.length - 1;int mid;while (l < r) {mid = l + r + 1 >> 1;if (arr[mid] <= value) {l = mid;} else {r = mid - 1;}}return arr[l] > value ? -1 : l;}
相信做完这两道题你对二分的理解也更近了一步,那么接下来综合这两道练习题,请完成leetcode32题,这道题是对这两道练习题的综合,可以帮助你更好的掌握二分法,同时二分的写法也有多种,请选择适合自己的边界条件。
局部最小值问题
定义局部最小值:局部最小值是指其值严格小于左右相邻元素的值,给你一个整数数组 nums,找到局部最小值元素并返回其索引。数组可能包含多个局部最小值,在这种情况下,返回 任何一个局部最小值 所在位置即可。
-
你可以认为 n u m s [ − 1 ] = + ∞ , n u m s [ n ] = + ∞ nums[-1] = +∞,nums[n] = +∞ nums[−1]=+∞,nums[n]=+∞
-
你必须实现时间复杂度为
O(log n)的算法来解决此问题。 -
n u m s [ i ] ! = n u m s [ i + 1 ] nums[i] != nums[i + 1] nums[i]!=nums[i+1]
-
n n n为数组长度
此题由于数据状况特殊,题目局部最小值的定义特殊,所以我们可以使用二分法进行求解。首先我们要先知道 n u m s [ − 1 ] = + ∞ , n u m s [ n ] = + ∞ nums[-1] = +∞,nums[n] = +∞ nums[−1]=+∞,nums[n]=+∞,也就是数组左侧是下降的,并且右侧也是下降(U型),而且相邻元素之间不相等,这就很特殊了,保证了数组之中一定有局部最小值,并且可以二分。如果 n u m s [ m i d ] < n u m s [ m i d + 1 ] nums[mid] < nums[mid + 1] nums[mid]<nums[mid+1]则左边会存在局部最小值去掉右边( r = m i d r = mid r=mid),如果 n u m s [ m i d ] > n u m s [ m i d + 1 ] nums[mid] > nums[mid + 1] nums[mid]>nums[mid+1]则右边会存在局部最小值去掉左边( l = m i d − 1 l = mid - 1 l=mid−1)。
public static int getLessIndex(int[] arr) {if (arr == null || arr.length == 0) {return -1; // no exist}if (arr.length == 1 || arr[0] < arr[1]) {return 0;}if (arr[arr.length - 1] < arr[arr.length - 2]) {return arr.length - 1;}int l = 1;int r = arr.length - 2;int mid = 0;while (l < r) {mid = l + r >> 1;if (arr[mid] >= arr[mid + 1]) {l = mid + 1;} else {r = mid;}}return l;}
请完成162. 寻找峰值,如果本篇文章对你有帮助,请点赞、评论、转发,你的支持是我创作的动力!!!
相关文章:
二分法
文章目录 二分法概述二分 > value最左的位置二分 < value最右的位置局部最小值问题 二分法概述 什么是二分法呢?相信大家都有所了解,举个最经典的二分的例子。 给定一个整型有序数组,和一个值 v a l u e value value,如…...
Linux文件类型与权限及其修改
后面我们写代码时,写完可能会出现没有执行权限什么的,所以我们要知道文件都有哪些权限和类型。 首先 就像我们之前目录结构图里面有个/dev,它就是存放设备文件的,也就是说,哪怕是一个硬件设备,例如打印机啥的…...
RPC 框架 openfeign 介绍和学习使用总结
一、基本概念 RPC 远程过程调用(Remote Procedure Call)的缩写形式 Birrell 和 Nelson 在 1984 发表于 ACM Transactions on Computer Systems 的论文《Implementing remote procedure calls》对 RPC 做了经典的诠释。 RPC 是指计算机 A 上的进程&am…...
大厂真题:【DP/贪心】字节跳动2023秋招-小红的 01 串
题目描述与示例 题目描述 小红拿到了一个 01 串,她准备将若干个字符1 染成红色,将若干个字符0 染成蓝色,但有个限制:如果一个0 和一个1 相邻,那么它们不能同时染色。 小红想知道,最多可以染多少个字符&a…...
【技术类-01】doc转PDF程序卡死的解决方案,
摘要: 1、报错: raise AttributeError("%s.%s" % (self._username_, attr))) 2、表现:doc转PDF卡死(白条不动或出现以上英文) 3、解决:在docx保存代码行后面加上time.sleep(3) 4、…...
探索未来,开启无限可能:打造智慧应用,亚马逊云科技大语言模型助您一臂之力
文章目录 什么是大模型?大模型训练方法亚马逊云科技推出生成式AI新工具 —— aws toolkit使用教程 总结 什么是大模型? 近期,生成式大模型是人工智能领域的研究热点。这些生成式大模型,诸如文心一言、文心一格、ChatGPT、Stable …...
HTML点击链接强制触发下载
常见网页中会有很多点击链接即下载的内容,以下示范一下如何实现 <a href"文件地址" download"下载的文件名字(不包括后缀)">强制下载</a> 下面举个例子: <a href"./image/test.jpg"…...
Paimon 与 Spark 的集成(一)
Paimon Apache Paimon (incubating) 是一项流式数据湖存储技术,可以为用户提供高吞吐、低延迟的数据摄入、流式订阅以及实时查询能力。Paimon 采用开放的数据格式和技术理念,可以与 ApacheFlink / Spark / Trino 等诸多业界主流计算引擎进行对接…...
批量导入SQL Server中的建表、建存储过程和建调度作业的文件
要批量导入SQL Server中的建表、建存储过程和建调度作业的文件,可以按照以下步骤进行操作: 确保你拥有适当的权限:在导入这些文件之前,请确保你具有足够的权限来创建表、存储过程和调度作业。通常需要具备数据库管理员(…...
启动Hbase出现报错
报错信息:slave1:head: cannot open/usr/local/hbase-2.3.1/bin/../logs/hbasewanggiqi-regionserver-slavel.out’ for reading: No such file or direslave2: head: cannot open/usr/local/hbase-2.3.1/bin/../logs/hbasewangqiqi-regionserver-slave2.out’ for …...
【数据结构】——栈、队列简答题模板
目录 一、栈(一)栈的基本概念(二)栈的应用(三)栈的代码实现(四)递归算法(五)栈与队列的区别 二、队列(一)队列的基本概念(…...
基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(排它条件网关)
更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 这个章节来完成并行网关与排它条件网关的功能 1、前端 目前就修改了排它条件网关的前端条件部分…...
【华为OD题库-007】代表团坐车-Java
题目 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。 约束: 1.一个团只能上一辆车࿰…...
利用servlet实现对书籍书名、单价、数量等信息的添加,计算总价
1.题目要求 利用servlet实现对书籍书名、单价、数量等信息的添加,计算总价。 要求:输入两次表单信息,在一个成功返回的页面里面显示两次的数据。 2.Book实体类 package com.hjj.sevletgk.hw7.book;/*** author:嘉佳 Date:2023/10/8 15:16*…...
一键批量转码:将MP4视频转为MP3音频的简单方法
随着数字媒体设备的普及,视频和音频格式转换的需求也越来越常见。其中,将MP4视频批量转换为MP3音频的需求尤为普遍。无论是为了提取视频中的背景音乐,还是为了在手机或电脑上方便地收听视频音频,这个过程都变得非常重要。接下来我…...
java入门,记一次微服务间feigin请求的问题
一、前言 记录工作中遇到的开发问题,而不是写博客凑字数。 二、微服务调用 1、通过本服务调用另外一个服务,需要定义一个接口,并用FeignClient 注解进行注解 value "服务名" 要调用的服务名 服务得到路径,对应的是c…...
HarmonyOS应用开发者高级认证(88分答案)
看好选择题,每个2分多答对2个刚好88分,祝你顺利。 其它帮扶选择题。 一、判断 只要使用端云一体化的云端资源就需要支付费用(错)所有使用Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期…...
离散Hopfield神经网络分类——高校科研能力评价
大家好,我是带我去滑雪! 高校科研能力评价的重要性在于它对高等教育和科研体系的有效运作、发展和提高质量具有深远的影响。良好的科研能力评价可以帮助高校识别其在不同领域的强项和薄弱点,从而制定战略,改进教学和科研ÿ…...
Run highlighted commands using IDE
背景 有时候在 IEDE 的命令行中输入命令,会弹出如下提示,或者命令被着了背景色了,是怎么回事? 其实就是提示你可以使用 IDEA 的功能替代命令行。比如使用ctrlenter或cmdenter之后使用的就是 IDEA 里的功能 直接enter运行&#x…...
vscode文件跳转(vue项目)
在 .vue 文件中,点击组件名打开 方式1: 在 vue 组件名上,桉住ctrl 鼠标左键 // 重新打开一个tab 方式2: 在 vue 组件名上,桉住ctrl shift 鼠标左键 // 在右侧拆分,并打开一个tab .vue文件的跳转 按住 …...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
