【二分查找专题】给出四种二分查找的模板
本问题对应课程链接:剑指offer刷题第七期
本次打卡的任务很简单,就是给出四种变形二分查找的模版代码,并且给出了对应的方法名字。
比如对于一个有序数组
arr = [1,2,3,3,3,4,5,5,7],target = 3,那么
1.寻找第一个大于 target 的元素的下标,本案例中4 就是第一个大于 target 的元素 ,下标 = 5。
对应方法名格式为
int upper(int[] arr, int target){
//如果都不存在,则返回-1
}
2.如果数组中存在元素等于 target,则返回最后一个等于target 的元素下标,如果不存在,则返回第一个大于 target 的元素下标。本案例中最后一个等于target的下标 = 4。
对应方法名
int floor_upper(int[] arr, int target){
//如果都不存在,则返回-1
}
3.寻找最后一个小于 target 的元素的下标,本案例中 2 则是最后一个小于 target 的,下标 = 1.
对应方法名格式为
int lower(int[] arr, int target){
//如果都不存在,则返回-1
}
4.如果数组中存在元素等于 target,则返回第一个等于target 的下标,如果不存在,则返回最后一个小于 target 的元素的下标。本案例中第一个等于target的下标 = 2。
对应方法名格式为
int floor_lower(int[] arr, int target){
//如果都不存在,则返回-1
}
注意:大家给了模版之后,选择一个适合自己的模版,以后都用这个模版,忘了怎么办?这玩意的区别就是要么是大于,要么是大于等于,你如果记混了,可以随便找一组数据试一下,就能分辨出来了,我笔试时都这样干,,,
共以下 13 个回答
打卡
参照他人代码
解题思路
– 第一个大于或者最后一个等于,是相邻的。第一个大于的index-1=最后一个等于的index
– 最后一个小于或第一个等于,是相邻的。最后一个小于的index+1=第一个等于的index
【题解1】
看了讲解之后独立写的,虽然和讲解一模一样哈哈哈
参考讲解写的
时间复杂度O(logN),空间复杂度O(N)。
// 1. 寻找第一个大于 target 的元素的下标
public static int upper(int[] arr, int target) {
int left = 0, right = arr.length – 1;
int result = -1;
时间复杂度:O(logn)
空间复杂度:O(1)
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1,2,3,3,3,4,5,5,7};
int target = 3;
floor_upper(arr, target);
}
}
时间:O(lgn)
空间:O(1)