题目描述:
统计一个数字在排序数组中出现的次数。
思路:
二分法
实现一个寻找k第一次出现索引的函数getfirst:
如果mid处=k,且mid-1处的元素小于k说明是当前位置
如果mid处=k,mid-1处的元素等于k,r = mid -1
如果mid处小于k,l = mid + 1
如果mid处大于k,r = mid - 1
利用这个函数找到第一个出现k的位置
找最后出现k位置的技巧是:将data取反倒叙,k取反,传入getfirst,可以得到k在倒数第几个出现
代码:
class Solution:
def GetNumberOfK(self, data, k):
# write code here
lid = self.getfirst(data, k)
rid = self.getfirst(map(lambda x: -x, data[::-1]), -k)
if lid == -1:
return 0
return len(data) - lid - rid
def getfirst(self, data, k):
l = 0
r = len(data) - 1
kid = -1
while l <= r:
mid = (l + r) // 2
if data[mid] == k:
if mid == 0 or data[mid - 1] < data[mid]:
kid = mid
break
else:
r = mid - 1
elif data[mid] < k:
l = mid + 1
else:
r = mid - 1
return kid