1、在一个有序数组中,找某个数是否存在
public static boolean exist(int[] arr, int num) {
// 判断不成立的条件
if (arr == null || arr.length == 0) {
return false
}
// 定义边界
int l = 0
int r = arr.length - 1
int mid = 0
while (l < r) {
// 保证不会越界
mid = l + ((r-l) >> 1)
if (arr[mid] == num) {
return true
} else if (arr[mid] > num) {
r = mid - 1
} else if (arr[mid] < num) {
l = mid + 1
}
}
return arr[l] == num
}
2、一个有序数组中,找>=某个数最左侧的位置
public class BSNearLeft {
// 找到最左位置 找满足>=value的最左位置
public static int nearest(int[] arr, int value) {
int l = 0
int r = arr.length - 1
// 定义一个标志 来记录符合大于等于一个数的标志的位置
int index = -1
while (l < r) {
int mid = l + ((r - l) >> 1)
if (arr[mid] >= value) {
index = mid
r = mid - 1
} else {
l = mid + 1
}
}
return index
}
public static void main(String[] args) {
int[] arr = {1,2,2,2,3,3,4,4,5,5}
int index = nearest(arr, 5)
System.out.println(index)
}
}
3、局部最小值问题
package com.jhy.day07
/**
* 局部最小值(0<1,n-1<n-2 i<i+1 && i<i-1 所以0和n-1和i都是局部最小)
* 在一个数组当中,这个arr无序,任意两个相邻的数一定不相等。
* 下面求一个局部最小的值 只需要一个就行
* 不一定有序就二分
* 2022年8月31日20:56:29
*/
public class FindOneLessValueIndex {
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的值
mid = left + ((right-left)>>1)
// 两个数一定不相等 所以我们不用考虑相等问题
if(arr[mid] > arr[mid-1]){
right = mid-1
}else if(arr[mid] > arr[mid+1]){
left = mid+1
}else {
return mid
}
}
/*
*这里放回left和right是一样的
* */
return right
}
public static void printArray(int[] arr) {
for (int i = 0
System.out.print(arr[i] + " ")
}
System.out.println()
}
public static void main(String[] args) {
int[] arr = { 6, 5, 3, 4, 6, 7, 8 }
printArray(arr)
int index = getLessIndex(arr)
System.out.println("index: " + index + ", value: " + arr[index])
}
}