只要能正确构建左右两侧的淘汰逻辑,就可以二分
在一个有序数组中,找 >= / <= 某个数最左侧的位置
2223333344444455555555
func TestNearestIndex(t *testing.T) {
t.Log(NearLeft([]int{1,1,2,3,3,3,4,5,6,7,7,7,7,7,9},7))
}
func NearRight(arr []int, value int) int {
L, R, index := 0, len(arr) - 1, -1
for L <= R {
mid := L + (R - L) >> 1
if arr[mid] <= value {
index = mid
L = mid + 1
}else {
R = mid - 1
}
}
return index
}
func NearLeft(arr []int, value int) int {
L, R, index := 0, len(arr) - 1, -1
for L <= R {
mid := L + (R - L) >> 1
if arr[mid] >= value {
index = mid
R = mid - 1
}else {
L = mid + 1
}
}
return index
}