该题目来源于牛客网《剑指offer》专题。
统计一个数字在排序数组中出现的次数。
看到排序数组,要想到用二分查找。
先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数。
Go语言实现:
func getNumberOfK(num []int, k int) int {
length := len(num)
firstK := getFirstK(num, k, 0, length-1)
lastK := getLastK(num, k, 0, length-1)
if firstK != -1 && lastK != -1 {
return lastK - firstK + 1
}
return 0
}
//递归
func getFirstK(num []int, k int, start int, end int) int {
if start > end {
return -1
}
mid := (start + end) / 2
if num[mid] > k {
return getFirstK(num, k, start, mid-1)
} else if num[mid] < k {
return getFirstK(num, k, mid+1, end)
} else if mid-1 >= 0 && num[mid-1] == k { //mid为k,mid-1也为k
return getFirstK(num, k, start, mid-1) //找到最前面的K
} else {
return mid
}
}
//循环
func getLastK(num []int, k int, start int, end int) int {
length := len(num)
mid := (start + end) / 2
for start <= end {
if num[mid] > k {
end = mid - 1
} else if num[mid] < k {
start = mid + 1
} else if mid+1 <= length-1 && num[mid+1] == k { //mid为k,mid+1也为k
start = mid + 1 //找到最后面的K
} else {
return mid
}
mid = (start + end) / 2
}
return -1
}