二分查找法upper版(找大于某个值的最小下标)递归+非递归版
需求:比如说查询一个班级大于60分的最低分等等。
思路与二分法基本相同,只不过是对比的逻辑发生了一些小变化,这里所说的上界就是指大于某个值的最小下标。
当mid < target :说明 target 的上界还在mid的右边,所以要去找比mid大的
当mid > target:说明 mid 有可能是target的上界,所以我们加个判断,如果mid前一个元素就刚好是target,说明mid就是我们要找的上界,否则继续找。
另一个注意的点,就是我们取变量 r 的时候,不再是取数组最大的下标了,而是要超过一个,因为如果你找的是数组最后一个元素的上界,其实是不在数组里的。
递归版:
package com.Search;
/**
* @Author: 翰林猿
* @Description: 二分查找upper版(找大于某个值的最小下标)
**/
public class BinarySearchUpper {
public BinarySearchUpper() {
}
public static <E extends Comparable<E>> int SearchUpper(E[] data, E target) {
return SearchUpper(data, 0, data.length, target); //是length而不是length-1,因为有可能上界值不在该数组里,所以此时r就应该取大于数组最大值下标+1的位置
}
/**
* @Description 递归版本
*/
public static <E extends Comparable<E>> int SearchUpper(E[] data, int l, int r, E target) {
if (l >= r) return -1;
int mid = l + (r - l) / 2;
if (data[mid].compareTo(target) <= 0) { //如果mid小于目标值,说明target的上界还在右边,要去找比mid大的
return SearchUpper(data, mid + 1, r, target);
}
if (data[mid].compareTo(target) > 0 && data[mid - 1].compareTo(target) == 0) {
return mid;
}
//说明mid又大于target,但是mid-1又不等于target,说明当前的mid不是上界。比如说测试用例1, 1, 1, 2, 2, 3, 6, 8, 18, 20
//我们要找大于3的最小下标也就是6的下标,但是经过两次递归,mid=18,但是18所在的下标为8,8-1=7的元素是8,但是8并不等于3,所以mid=18时不是我们要找的upper
//此时继续递归
return SearchUpper(data, l, mid, target); //mid已经大于目标值了,而且当前的mid不是上界,所以我们往左边找
}
public static void main (String[]args){
Integer[] arr = {1, 1,1, 2, 2, 3, 6, 8, 18, 20};
int index = SearchUpper(arr, 3);
System.out.println(index);
}
}
非递归版:
package com.Search;
/**
* @Author: 翰林猿
* @Description: 二分查找upper版(找大于某个值的最小下标)
**/
public class BinarySearchUpper {
public BinarySearchUpper() {
}
public static <E extends Comparable<E>> int SearchUpper2(E[] data, E target) {
return SearchUpper2(data, 0, data.length, target); //是length而不是length-1,因为有可能上界值不在该数组里,所以此时r就应该取大于数组最大值下标+1的位置
}
/**
* @Description 非递归版本
*/
public static <E extends Comparable<E>> int SearchUpper2(E[] data, int l, int r, E target) {
while (l < r) {
int mid = l + (r - l) / 2;
if (data[mid].compareTo(target) == 0) {
return mid + 1;
} else if (data[mid].compareTo(target) > 0) { // 这个r = mid是因为mid的位置可能是目标值
r = mid;
} else {
l = mid + 1;
}
}
// l和r最后都都指向同一个位置。没找到则返回arr.length
return l;
}
public static void main (String[]args){
Integer[] arr = {1, 1,1, 2, 2, 3, 6, 8, 18, 20};
int index2 = SearchUpper2(arr, 3);
System.out.println(index2);
}
}
二分查找法upper版(找大于某个值的最小下标)递归+非递归版的更多相关文章
- 二分查找法(java版)
二分查找法也称为折半查找法,在有序的序列中使用二分法可以提高程序的执行效率. 典型的二分查找法代码 public int binarySearch1(int[] arr,int target){ in ...
- jvascript 顺序查找和二分查找法
第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...
- python 全栈开发,Day15(递归函数,二分查找法)
一.递归函数 江湖上流传这这样一句话叫做:人理解循环,神理解递归.所以你可别小看了递归函数,很多人被拦在大神的门槛外这么多年,就是因为没能领悟递归的真谛. 递归函数:在一个函数里执行再调用这个函数本身 ...
- Golang实现二分查找法
二分查找法就是实现在一组有序的数字数组集合中最快找到指定元素的下标 思路 ①先找到中间的下标middle = (leftIndex + RightIndex) /2 ,然后让中间的下标值和FindVa ...
- InnoDB索引概述,二分查找法,平衡二叉树
索引是应用程序设计和开发的一个重要方面.如果索引太多,应用的性能可能会受到影响:如果索引太少,对查询性能又会产生影响.要找到一个合适的平衡点,这对应用的性能至关重要. 如果知道数据的使用,从一开始就应 ...
- 面试官,我会写二分查找法!对,没有 bug 的那种!
前言科普 第一篇二分搜索论文是 1946 年发表,然而第一个没有 bug 的二分查找法却是在 1962 年才出现,中间用了 16 年的时间. 2019 年的你,在面试的过程中能手写出没有 bug 的二 ...
- 选择、冒泡排序,二分查找法以及一些for循环的灵活运用
import java.util.Arrays;//冒泡排序 public class Test { public static void main(String[] args) { int[] ar ...
- 数据机构-折半查找法(二分查找法)-Python实现
Python实现二分查找法(基于顺序表) class List: elem=[] #存储顺序表元素 last=-1 #设置初始为-1 SeqList = List() #创建一个顺序表 print(& ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){ if ( ...
- php实现二分查找法
二分查找法需要数组是一个有序的数组 假设我们的数组是一个递增的数组,首先我们需要找到数组的中间位置. 一.要知道中间位置就需要知道起始位置和结束位置,然后取出中间位置的值来和我们的值做对比. 二.如果 ...
随机推荐
- PVE虚拟系统的安装
上期有说到,会出一些具体的安装过程以及掉进去的坑.这集我就说一说PVE系统的安装. As mentioned in the previous issue, there will be some ...
- Nvidia Tensor Core初探
1 背景 在基于深度学习卷积网络的图像处理领域,作为计算密集型的卷积算子一直都是工程优化的重点,而卷积计算一般转化为矩阵乘运算,所以优化矩阵乘运算自然成为深度学习框架最为关心的优化方向之一.鉴于此,N ...
- Redis(三)jedis与锁
1 Jedis 引入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis ...
- 【Spring5】JdbcTemplate
JdbcTemplate实现对数据库增删改查 步骤 导入Jar包 mysql-connector-java-8.0.28.jar:mysql数据库连接的相关依赖 spring-tx-5.2.6.REL ...
- Django简介 安装下载 app概念 主要目录介绍
目录 Django简介 前戏 Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,视图V和模版T.这套框架是以比利时的吉普赛爵士吉他手Django Re ...
- Centos7.x 安装配置jdk与jmeter
一.准备 1.jmeter(下载地址:https://jmeter.apache.org/download_jmeter.cgi) 2.jdk(下载地址:https://www.oracle.com/ ...
- Java8 Stream流的合并
最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性.比如一个Customer对象,有3个Id:id1,id2,id3,要把这些Id全部取出来,然后去数据库里查询它是否存在. @Da ...
- 终端命令行前出现(base)
原因 (base) 的出现是因为电脑安装了conda后,每次打开终端都会自动启动conda的base环境 解决 取消自动启动base环境:conda config --set auto_activat ...
- JavaScript原生兼容大全-持续更新
JavaScript兼容-持续更新 1.css非行内样式操作 // currentStyle用于IE低版本 getComputed用于主流浏览器 // element 目标元素 attribute 目 ...
- 《 Istio 权威指南 》新著重磅发行!华为云云原生团队匠心力作
摘要:由 Istio社区指导委员会成员和华为云云原生团队联合编著的云原生服务网格书籍< Istio 权威指南>重磅上市 本文分享自华为云社区<< Istio 权威指南 > ...