2023.3.21
6:有序数组中找到num
// arr保证有序,在arr数组中寻找num,二分查找public static boolean find(int[] arr, int num) {if(arr == null || arr.length == 0) {return false;}int L = 0;int 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;}
7:有序数组中找到>=num最左的位置
首先通过二分查找找到的是mid == 5位置的数,arr【5】 >= 2 ,符合条件,让T记录一下这个位置,T = 5;
然后再去左边寻找,看看有没有arr>=2并且下标比5小的位置,如果有就让T记录一下这个位置,将最后的T的结
果返回。
// 有序数组中找到>=num最左的位置// 1 2 2 3 4 5 6 7 数组// 0 1 2 3 4 5 6 7 下标// num == 2 return 1public static int mostLeftNoLessNumIndex(int[] arr, int num) {if(arr == null || arr.length == 1) {return -1;}int L = 0;int R = arr.length - 1;// ans:是用来计数的,用来记录>=num的位置int t = -1;while(L <= R) {int mid = (L + R) / 2;if(arr[mid] >= num) {t = mid;R = mid - 1;}else {L = mid + 1;}}return t;}
8:有序数组中找到<=num最右的位置
// 有序数组中找到<=num最右的位置// 1 2 2 3 4 5 6 7 数组// 0 1 2 3 4 5 6 7 下标// num <= 2 return 2public static int nearestIndex(int[] arr, int value) {if(arr == null || arr.length == 1) {return -1;}int L = 0;int R = arr.length - 1;// ans:是用来计数的,用来记录>=num的位置int t = -1;while(L <= R) {int mid = (L + R) / 2;if(arr[mid] <= value) {t = mid;L = mid + 1;}else {R = mid - 1;}}return t;}
9:局部最小值问题
自写:
// arr 相邻的数不相等! 返回一个局部最小的下标public static int oneMinIndex(int[] arr) {if(arr == null || arr.length == 0) {return -1;}if(arr.length == 1) {return 0;}int L = 0;int R = arr.length - 1;if(arr[L] < arr[L + 1]) {return L;}if(arr[R] < arr[R - 1]) {return R;}// 之后是两边下陷的情况while(L <= R) {int mid = (L + R) / 2;if (mid -1 >= L && mid +1 <= R && arr[mid] < arr[mid + 1] && arr[mid] < arr[mid - 1]) {return mid;}if(mid -1 >= L && arr[mid] > arr[mid - 1]) {R = mid - 1;continue;}if(mid +1 <= R && arr[mid] > arr[mid + 1]) {L = mid + 1;}// L与R相邻的时候,直接返回最小的那个if(mid == L || mid == R) {return arr[L] > arr[R] ? R : L;}}return -1;}
左神:
// arr 相邻的数不相等! 返回一个局部最小的下标public static int oneMinIndex2(int[] arr) {if(arr == null || arr.length == 0) {return -1;}if(arr.length == 1) {return 0;}int L = 0;int R = arr.length - 1;if(arr[L] < arr[L + 1]) {return L;}if(arr[R] < arr[R - 1]) {return R;}// 之后是两边下陷的情况while(L < R-1) {int mid = (L + R) / 2;if (arr[mid] < arr[mid + 1] && arr[mid] < arr[mid - 1]) {return mid;}if(arr[mid] > arr[mid - 1]) {R = mid - 1;continue;}if(arr[mid] > arr[mid + 1]) {L = mid + 1;}}return arr[L] < arr[R] ? L : R;}
总结一下:
public static int oneMinIndex3(int[] arr) {if (arr == null || arr.length == 0) {return -1;}int N = arr.length;if (N == 1) {return 0;}//到这,arr的长度是大于等于2的if (arr[0] < arr[1]) {return 0;}if (arr[N - 1] < arr[N - 2]) {return N - 1;}int L = 0;int R = N - 1;int ans = -1;while (L <= R) {int mid = (L + R) / 2;//中间位置是否是最小,[mid-1] > [mid] < [mid+1]if (arr[mid] < arr[mid - 1] && arr[mid] < arr[mid + 1]) {ans = mid;break;//不同时小,下面两个判断选一个就行} else if (arr[mid] > arr[mid - 1]) {R = mid;} else {//arr[mid] > arr[mid + 1]L = mid;}}return ans;}
}
L == 0 ,R == n - 1
0 与 n - 1位置上一定不是局部最小值,而 [ 1 , n-2 ] 之间一定有局部最小值,所以 mid (mid:锁定局部最小
值的)不可能来到下标 0 与 n - 1 的位置,下标 0 与 n - 1 作为一个缓冲区(如果来到0或n-1的旁边,0与n - 1
可作为一个缓冲区,就不会出现mid-1或者mid+1越界的情况)。如果mid位置是局部最小值就返回了,如果没
返回说明mid位置不是局部最小值,我们就令L == mid 或者是 R == mid,这样 L 与 R 也是一个缓冲区,L与R
之间一定有局部最小值。还有就是,不会有(L == 0&& R == 1 ) || (L == N-2 && R == N-1 )
的情况,如果出现上述的情况说明一定没有局部最小值(L与R是缓冲区,中间没有值),然而事实是一定有
局部最小值。
这个方法的关键是:下标0,N-1的区域做缓冲区,L与R做缓冲区。所以没有越界的风险。
public static int getLessIndex(int[] arr) {if (arr == null || arr.length == 0) {return -1;}if (arr.length == 1 || arr[0] < arr[1]) {return 0;}if (arr[arr.length - 1] < arr[arr.length - 2]) {return arr.length - 1;}int left = 1;int right = arr.length - 2;int mid = 0;while (left <= right) {mid = (left + right) / 2;if (arr[mid] > arr[mid - 1]) {right = mid - 1;} else if (arr[mid] > arr[mid + 1]) {left = mid + 1;} else {return mid;}}// 这个地方return谁都是对的,因为一定有区域最小值return left; }
L == 1 ,R == n - 2
如果mid位置是局部最小值就返回了,如果没返回说明mid位置不是局部最小值,我们就
令L == mid + 1 或者是 R == mid - 1,mid一定不是局部最小值,但是mid+1与mid-1可能是局部最小值。所以
【L,R】L与R之间都是 “好的” 都是有可能是局部最小值的区域,剔除不是局部最小值的部分,在是局部最小
值的区域寻找。
这个方法的关键:[L , R] L与R之间都是“好的”部分(可能是局部最小值的部分)不可能来到下标 0,n - 1位
置,并且下标 0,n - 1位置可以作为一个缓冲,所以不会出现越界的状况。
// arr 相邻的数不相等! 返回一个局部最小的下标public static int oneMinIndex(int[] arr) {if(arr == null || arr.length == 0) {return -1;}if(arr.length == 1) {return 0;}int L = 0;int R = arr.length - 1;if(arr[L] < arr[L + 1]) {return L;}if(arr[R] < arr[R - 1]) {return R;}// 之后是两边下陷的情况while(L <= R) {int mid = (L + R) / 2;if (mid -1 >= L && mid +1 <= R && arr[mid] < arr[mid + 1] && arr[mid] < arr[mid - 1]) {return mid;}if(mid -1 >= L && arr[mid] > arr[mid - 1]) {R = mid - 1;continue;}if(mid +1 <= R && arr[mid] > arr[mid + 1]) {L = mid + 1;}// L与R相邻的时候,直接返回最小的那个if(mid == L || mid == R) {return arr[L] > arr[R] ? R : L;}}return -1;}
L == 0 R == n - 1
下标为0 和 n - 1的位置是一个缓冲区。
如果mid位置是局部最小值就返回了,如果没返回说明mid位置不是局部最小值,我们就
令L == mid + 1 或者是 R == mid - 1。
刚开始L == 0,R == n - 1是一个缓冲区,仅当R == mid - 1的时候,R失去了缓冲区的作用,但是L仍然是缓冲
区,因为R是“好的”,所以当R来到下标为1的位置就会出现越界的风险,因为此时mid指向L,即0下标。
而上面的方法1不会有问题的原因是:L与R都是缓冲区,不会有(L == 0&& R == 1 ) || (L == N-2 && R == N-1 )
的情况,如果出现上述的情况说明一定没有局部最小值(L与R是缓冲区,中间没有值),然而事实是一定有
局部最小值。
而本方法就会有(L == 0&& R == 1 )的情况出现,因为R 不是缓冲区。一遍是缓冲区一遍不是缓冲区,就有可
能越界。
写代码的时候别写方法三这种半吊子代码。
相关文章:

2023.3.21
6:有序数组中找到num // arr保证有序,在arr数组中寻找num,二分查找public static boolean find(int[] arr, int num) {if(arr null || arr.length 0) {return false;}int L 0;int R arr.length - 1;while (L < R) {int mid (L R) /…...
制作数据库框架
一 利用前端条件组装sql与查询条件的集合public void handle() throws Exception{Map<String,String> requestMap new HashMap();String fromdate requestMap.get("fromdate");String todate requestMap.get("todate");String resultcode reque…...

Winbond W25Qxx SPI FLASH 使用示例(基于沁恒CH32V307单片机)
文章目录目的基础说明使用示例总结目的 Winbond(华邦)的 W25Qxx 系列 SPI FLASH 是比较常用的芯片,这篇文章将演示单片机中通过SPI使用该芯片的操作过程。 本文使用沁恒官方的开发板 (CH32V307-EVT-R1沁恒RISC-V模块MCU赤兔评估…...

贪心算法的原理以及应用
文章目录0、概念0.1.定义0.2.特征0.3.步骤0.4.适用1、与动态规划的联系1.1.区别1.2.联系2、例子3、总结4、引用0、概念 0.1.定义 贪心算法(greedy algorithm ,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是…...

WebRTC拥塞控制原理之一基本介绍
1 基本原理 WebRTC的拥塞控制模块使用的是基于TCP的拥塞控制算法。它是根据网络带宽和延迟等信息来自适应地调整传输速率的。 具体来说,该模块采用的是基于RFC 3550中的延迟抖动调整算法的改进版本。该算法实施的基本原理是在传输的过程中定期探测网络的质量和延迟…...
选择 .NET 的 n 个理由
自从我们启动快速发展的 .NET 开源和跨平台项目以来,.NET 发生了很大变化。我们重新思考并完善了该平台,添加了专为性能和安全性而设计的新低级功能,以及以生产力为中心的高级功能。Span<T>、硬件内在函数和可为空的引用类型都是示例。…...

spark第三章:工程化代码
系列文章目录 spark第一章:环境安装 spark第二章:sparkcore实例 spark第三章:工程化代码 文章目录系列文章目录前言一、三层架构二、拆分WordCount1.三层拆分2.代码抽取总结前言 我们上一次博客,完成了一些案例的练习࿰…...
Vue实战【封装一个简单的列表组件,实现增删改查】
文章目录🌟前言🌟table组件封装🌟父组件(展示表格的页面)🌟控制台查看父子组件通信是否成功🌟Vue2父子组件传递参数🌟写在最后🌟JSON包里写函数,关注博主不迷…...

微前端(无界)
前言:微前端已经是一个非常成熟的领域了,但开发者不管采用哪个现有方案,在适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户核心诉求都或存在问题,或无法提供支持。本…...
强烈推荐:0基础入门网安必备《网络安全知识图谱》
蚁景网安学院一直专注于网安实战技能培养,提供全方位的网安安全学习解决方案。我们集聚专业网安技术大佬资源,倾力打造了这本更全面更系统的“网络安全知识图谱”,让大家在网络安全学习路上不迷茫。 在这份网安技能地图册里,我们对…...

网络技术与应用概论(上)——“计算机网络”
各位CSDN的uu们你们好呀,今天,小雅兰的内容依旧是计算机网络的一些知识点噢,下面,让我们进入计算机网络的世界吧 网络内涵 网络特征 网络定义 互联网发展过程 从ARPA网络到Internet 从低速互联网到高速互联网 从数据结构到统一网…...

JAVASE/封装、继承、多态
博客制作不易,欢迎各位点赞👍收藏⭐关注前言在学习面向对象编程语言时,封装、继承、多态则是我们必须学习和使用的三大特征。本文通过举例,说明了该三大特征的基本权限特点。一、访问限定符范围private默认权限protectedpublic同一…...

SpringBoot ElasticSearch 【SpringBoot系列16】
SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 elasticsearch是一款非常强大的开源搜索引擎&a…...
Virtual box磁盘大小调整操作
Virtual box磁盘大小调整操作环境说明思路操作1、挂载要压缩的硬盘到 ~/data2、填充 0 文件3、删除 全是0空文件4、虚拟机关机5、在windows环境下用VBoxManage.exe 进行压缩硬盘加大环境说明 主机 windows 虚拟机 ubuntu 分配了 80G 的硬盘,现在已经占用 80 G 了。…...

MySQL注入秘籍【上篇】
MySQL注入秘籍【上篇】1.数据库敏感信息常用语句2.联合(UNION)查询注入3.报错注入原理常见报错注入函数1.数据库敏感信息常用语句 获取数据库版本信息 select version(); select innodb_version;获取当前用户 select user();获取当前数据库 select database();数…...

简单三步解决动态规划难题,记好这三步,动态规划就不难
目录一、简单的一维DP剑指 Offer 10- I. 斐波那契数列1、三板斧解决问题2、优雅的解决问题剑指 Offer 63 股票的最大利润1、三板斧解决问题2、优雅的解决问题二、进阶的二维DP剑指offer47 礼物的最大价值1、三板斧解决问题2、优雅的解决问题编辑距离1、三板斧解决问题2、优雅的…...

算法进阶指南打卡
文章目录 基本算法 位运算递推与递归前缀和与差分二分排序倍增贪心总结与练习基本数据结构 栈队列链表与邻接表Hash字符串Tire二叉堆总结与练习搜索 树与图的遍历深度优先搜索剪枝迭代加深广度优先搜索广度变形A*IDA*总结与练习数学知识 质数约数同余矩阵乘法高斯消元与线性空…...

Chapter6.2:其他根轨迹及综合实例分析
该系列博客主要讲述Matlab软件在自动控制方面的应用,如无自动控制理论基础,请先学习自动控制系列博文,该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接:https://blog.csdn.net/qq_39032096/category_10287468…...

3. 无重复字符的最长子串——滑动窗口
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…...

ChatGPT研究分享:机器第一次开始理解人类世界
0、为什么会对ChatGPT感兴趣一开始,我对ChatGPT是没什么关注的,无非就是有更大的数据集,完成了更大规模的计算,所以能够回答更多的问题。但后来了解到几个案例,开始觉得这个事情并不简单。我先分别列举出来,…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...