题目描述
统计一个数字在排序数组中出现的次数。
思路
《剑指offer》P204
考虑使用二分法进行统计。
- 第一次二分法,找到该数字出现的位置
pos
- 分别对
pos
左右两边的数组进行多次二分查找,找到首尾出现的位置。
注意:k
在数组中不存在的情况。
code
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
if not data:
return 0
start = 0
end = len(data) - 1
# 先找到k的某个位置
index = self.binaryFind(data, start, end, k)
if index == -1:
return 0
indexLeft = index
indexRight = index
# 找到左右两边的位置
while indexLeft > 0 and data[indexLeft - 1] == k:
indexLeft = self.binaryFind(data, 0, indexLeft - 1, k)
while indexRight < end and data[indexRight + 1] == k:
indexRight = self.binaryFind(data, indexRight + 1, end, k)
return indexRight - indexLeft + 1
def binaryFind(self, data, left, right, k):
while left <= right:
mid = (right + left) / 2
if data[mid] > k:
right = mid - 1
elif data[mid] < k:
left = mid + 1
else:
return mid
return -1