首页 > 其他分享 >四种二分查找法模板

四种二分查找法模板

时间:2022-12-13 11:36:03浏览次数:57  
标签:二分 arr right target int mid 查找 模板 left


public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1,2,3,3,3,4,5,5,7};
int upper1 = floor_lower(arr, 3);
System.out.println(upper1);

}
//1.寻找第一个大于 target 的元素的下标,本案例中4 就是第一个大于 target 的元素 ,下标 = 5。
public static int upper(int[] arr,int target){
int left = 0;
int right = arr.length-1;
if(arr[right] <= target) return -1;
while (left < right) {
int mid = left + (right - left) / 2;
if (arr[mid] > target) {
//[l,mid,r]
right = mid;
} else if (arr[mid] == target) {
left = mid + 1;
} else {
left = mid + 1;
}
}
return left;
}
//2.如果数组中存在元素等于 target,则返回最后一个等于target 的元素下标,如果不存在,则返回第一个大于 target 的元素下标。本案例中最后一个等于target的下标 = 4。
public static int floor_upper(int[] arr,int target){
int left = 0;
int right = arr.length-1;
if(arr[right] < target) return -1;
while (left < right) {
int mid = left + (right - left) / 2;
if (arr[mid] > target) {
//[l,mid,r]
right = mid;
} else if (arr[mid] == target) {
left = mid + 1;
} else {
left = mid + 1;
}
}
if (left - 1 >= 0 && arr[left - 1] == target){
return left - 1;
}
return left;
}
//3.寻找最后一个小于 target 的元素的下标,本案例中 2 则是最后一个小于 target 的,下标 = 1.
public static int lower(int[] arr,int target){
int left = 0;
int right = arr.length - 1;
if(arr[left] >= target) return -1;
while (left < right){
int mid = left+(right-left+1)/2;
if (arr[mid] < target){
left = mid;
}else if(arr[mid] == target){
right = mid - 1;
}else {
right = mid - 1;
}
}
return right;
}
//4.如果数组中存在元素等于 target,则返回第一个等于target 的下标,如果不存在,则返回最后一个小于 target 的元素的下标。本案例中第一个等于target的下标 = 2。
public static int floor_lower(int[] arr,int target){
int left = 0;
int right = arr.length - 1;
if(arr[left] > target) return -1;
while (left < right){
int mid = left+(right-left+1)/2;
if (arr[mid] < target){
left = mid;
}else if(arr[mid] == target){
right = mid - 1;
}else {
right = mid - 1;
}
}
if (right + 1 < arr.length && arr[right + 1] == target) return right + 1;
return right;
}
}


标签:二分,arr,right,target,int,mid,查找,模板,left
From: https://blog.51cto.com/u_15911055/5933482

相关文章

  • P3378 【模板】堆
    P3378【模板】堆题目简述给定三个操作,求数列中最小的数,删除数列中最小的数,插入一个新的数思路板子题没什么好说,用stl自带的优先队列很好写,但手写的也要掌握。建议......
  • P3865 【模板】ST 表
    P3865【模板】ST表题目简述对于给定的数列,要求以\(\theta(1)\)的时间复杂度计算出\([l_i,r_i]\)中最大值思路没什么可讲的,但要注意,计算区间长度的对数要是log2(r-l......
  • P5905 【模板】Johnson 全源最短路
    P5905【模板】Johnson全源最短路...处理负权边的方法十分巧妙,就像是势能一样算法上文链接有详解,就不赘述了,这样就实现了dij也可以处理负边是需要提前预处理一遍,建立......
  • 数据模板 DataTemplate
    <Grid><ListBoxx:Name="list"><ListBox.ItemTemplate><DataTemplate><StackPanelOrientation="Horizont......
  • cmakelist 基础模板
    一个最基础的cmake模板#cmakeneedsthislinecmake_minimum_required(VERSION3.1)#Defineprojectnameproject(opencv_example_project)find_package(OpenCV......
  • 二分查找以及二分查找的变形
    二分查找以及二分查找的变形常规二分查找:在有序数组中找到num代码://1.常规二分查找首先需要保证这个数组是有序的//在有序数组中找到numpublicstaticboole......
  • Unity 自定义创建脚本模板
    Unity自定义创建脚本模板原理:以模板代码为底板,通过关键字替换来实现代码创建两种实现方案方案11.先准备好对应的代码模板,放到Assets\ScriptTemplates目录下usingSys......
  • DS哈希查找—二次探测再散列
    题目描述定义哈希函数为H(key)=key%11。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。输入测试次数t每组测试数据格式如下:哈希......
  • 【LeetCode】二分法--剑指 Offer 53 - I. 在排序数组中查找数字 I
    点击直达题目内容统计一个数字在排序数组中出现的次数。示例示例1:输入:nums=[5,7,7,8,8,10],target=8输出:2示例2:输入:nums=[5,7,7,8,8,10],target......
  • 查找
    importjava.util.Scanner;publicclassEext{publicstaticvoidmain(String[]args){String[]str={"lala","koko","joke"};A02a02......