题目描述
统计一个数字在排序数组中出现的次数。
解题思路
二分查找到给定的数字及其坐标。以该坐标为中点,向前向后找到这个数字的 始 – 终 位置。
第一版代码:
def GetNumberOfK(self, data, k):
if len(data) < 1:
return 0
mid = len(data)//2
if data[mid] == k:
count,mida, midz = 1,mid-1, mid+1
while mida >= 0 and data[mida] == k:
count += 1
mida -= 1
while midz < len(data) and data[midz] == k:
count += 1
midz += 1
return count
elif data[mid]>k:
return self.GetNumberOfK(data[:mid], k)
else:
return self.GetNumberOfK(data[mid+1:],k)
改进版:
def GetNumberOfK(self, data, k):
if len(data) < 1:
return 0
mid = len(data)//2
if data[mid] == k:
start,end = mid, mid
for i in range(mid,-1,-1):
if data[i] == k: start -= 1
for j in range(mid+1,len(data)):
if data[j] == k: end += 1
return end - start
elif data[mid]>k:
return self.GetNumberOfK(data[:mid], k)
else:
return self.GetNumberOfK(data[mid+1:],k)