计算数字左右边界位置
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号