查看数组是否存在target
func exist(arr []int, target int) bool {
L := 0
R := len(arr) - 1
for L < R {
mid := L + (R - L) >> 1
if arr[mid] == target {
return true
} else if arr[mid] > target {
R = mid - 1
} else {
L = mid + 1
}
}
查找≤target最左边元素的index
func nearestIndex1(arr []int, target int) int {
L := 0
R := len(arr) - 1
index := -1
for L <= R {
mid := L + (R - L) >> 1
if arr[mid] >= target {
index = mid
R = mid - 1
} else {
L = mid + 1
}
}
return index
}
查找≥target最右边元素的index
func nearestIndex2(arr []int, target int) int {
L := 0
R := len(arr) - 1
index := -1
for L <= R {
mid := L + (R - L) >> 1
if arr[mid] <= target {
index = mid
L = mid + 1
} else {
R = mid - 1
}
}
return index
}
局部最小值
给定数组arr,大小为N。每个元素相邻的元素都不相等,以下情况可以称为局部最小量:
- arr[0] < arr[1],arr[0]为局部最小。
- arr[n - 1] < arr[n - 2],arr[n -1]为局部最小。
- arr[i] < arr[i + 1] && arr[i] < arr[i - 1],arr[i]为局部最小。
func localmin(arr []int) int {
n := len(arr)
if n == 0 {
return -1
}
if n == 1 || arr[0] < arr[1] {
return arr[0]
}
if arr[n - 1] < arr[n - 2] {
return arr[n -1]
}
L := 1
R := n - 2
for L < R {
mid := L + (R - L) >> 1
if arr[mid] < arr[mid + 1] && arr[mid] < arr[mid - 1] {
return arr[mid]
} else if arr[mid] > arr[mid - 1] {
R = mid - 1
} else {
L = mid + 1
}
}
return arr[L]
}