计算数字左右边界位置

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
}