题目描述:统计一个数字在排序数组中出现的次数
如果直接遍历,需要O(n)的时间复杂度,由于数组是排序数组,因此可以用二分查找法找出第一个出现的位置和最后一个出现的位置。
如果之前的数字不是k,那么返回位置,否则继续查找前半部分。
二分查找不仅可以统计排序数组中,一个数字是否出现,还可以统计这个数字出现的次数
class Solution:
def firstIndexOfK(self, data, k, start, end):
if start > end:
return -1
middle = (int)((end + start) / 2)
if data[middle] == k:
if middle == 0 or (middle > 0 and data[middle - 1] != k):
return middle
else:
end = middle - 1
elif data[middle] < k:
start = middle + 1
else:
end = middle - 1
return self.firstIndexOfK(data, k, start, end)
def lastIndexOfK(self, data, k, start, end):
if start > end:
return -1
middle = (int)((end + start) / 2)
if data[middle] == k:
if middle == len(data) - 1 or(middle < len(data) - 1 and data[middle + 1] != k):
return middle
else:
start = middle + 1
elif data[middle] < k:
start = middle + 1
else:
end = middle - 1
return self.lastIndexOfK(data, k, start, end)
def GetNumberOfK(self, data, k):
if data == []:
return 0
firstIndex = self.firstIndexOfK(data, k, 0, len(data) - 1)
lastIndex = self.lastIndexOfK(data, k, 0, len(data) - 1)
if firstIndex == -1 or lastIndex == -1:
return 0
else:
return lastIndex - firstIndex + 1