统计一个数字在排序数组中出现的次数。
既然输入的数组是排序的,那么我们很自然地可以想到用二分查找算法。我们可以先用二分查找算法找到一个k,然后在找到的k的左右两边顺序扫描。因为要查找的数字在长度为n的数组中有可能出现了n次,所以顺序扫描的时间复杂度是O(n)。这样和直接扫描整个数组进行统计的效率是一样的,显然并不好。
如何更好地利用二分查找算法…
我们可以利用二分查找算法确定第一个k和最后一个k的位置,然后就可以计算出k在数组中出现的次数了。
# -*- coding:utf-8 -*-
class Solution:
def GetFirstK(self, data, k, start, end):
if start > end:
return -1
middle_index = int((start + end) / 2)
if data[middle_index] > k:
end = middle_index - 1
elif data[middle_index] < k:
start = middle_index + 1
else:
if middle_index > 0 and data[middle_index - 1] != k or middle_index == 0:
return middle_index
else:
end = middle_index - 1
return self.GetFirstK(data, k, start, end)
def GetLastK(self, data, k, start, end):
if start > end:
return -1
middle_index = int((start + end) / 2)
if data[middle_index] > k:
end = middle_index - 1
elif data[middle_index] < k:
start = middle_index + 1
else:
if middle_index < len(data) - 1 and data[middle_index + 1] != k or middle_index == len(data) - 1:
return middle_index
else:
start = middle_index + 1
return self.GetLastK(data, k, start, end)
def GetNumberOfK(self, data, k):
# write code here
number = 0
if data:
start = self.GetFirstK(data, k, 0, len(data) - 1)
end = self.GetLastK(data, k, 0, len(data) - 1)
if start != -1 and end != -1:
number = end - start + 1
return number