提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
三、有序数组中找到<=num最右的位置
一、有序数组中找到num
常规方法无非两种,最直接的遍历数组,挨个判断num是否存在,但时间复杂度为o(n);使用二分法进行寻找,时间复复杂度为0(logn)。
代码如下(示例):
public class SelectNum {
public static boolean find(int[] arr, int num) {
if (arr.length == 0 || arr == null) {
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;
}
}
二、有序数组中找到>=num最左的位置
本质上就是对数组不停的二分法,直到不能再切分为止。
例:arr=[1,2,2,3,6,7,9,12] num=2
Index=1
代码如下(示例):
public static int selectLeftIndex(int[] arr, int num) {
if (arr == null || arr.length == 0) {
return -1;
}
int L = 0;
int R = arr.length - 1;
int Index = -1;
while (L <= R) {
int mid = (L + R) / 2;
if (arr[mid] >= num) {
Index = mid;
R = mid - 1;
} else {
L = mid + 1;
}
}
return Index;
}
三、有序数组中找到<=num最右的位置
例:arr=[1,2,2,3,6,7,9,12] num=8
Index=5
代码如下(示例):
public static int selectRightIndex(int[] arr, int num) {
int L = 0;
int R = arr.length - 1;
int index = -1; // 记录最右的对号
while (L <= R) {
int mid = L + ((R - L) >> 1);
if (arr[mid] <= num) {
index = mid;
L = mid + 1;
} else {
R = mid - 1;
}
}
return index;
}