计算数字左右边界位置
package main
/**
*
* @param data int整型一维数组
* @param k int整型
* @return int整型
*/
func GetNumberOfK( data []int , k int ) int {
// write code here
if len(data) == 0{
return 0
}
// 右边界没找到该数字,则左边界也不会找到,就是不存在
// 不存在该数字,直接返回0
right := rightBound(data, k)
if right == -1 {
return 0
}
left := leftBound(data, k)
// 该数字右边界出现的位置 - 左边界出现的位置 + 1
return right - left + 1
}
// k 在数组中左边界出现的位置
func leftBound(arr []int, k int) int {
left, right := 0, len(arr)-1
for left <= right {
middle := left + (right-left)>> 1
if arr[middle] == k {
right = middle-1
}else if arr[middle] < k {
left = middle+1
}else if arr[middle] > k {
right = middle -1
}
}
if left >= len(arr) || arr[left] != k {
return -1
}
return left
}
// k 在数组中右边界出现的位置
func rightBound(arr []int, k int) int {
left, right := 0, len(arr)-1
for left <= right {
middle := left + (right-left)>>1
if arr[middle] == k {
left = middle + 1
}else if arr[middle] > k {
right = middle -1
}else if arr[middle] < k {
left = middle + 1
}
}
if right < 0 || arr[right] != k {
return -1
}
return right
}
京公网安备 11010502036488号