记录次数,直接用data.count(k)也通过了。或者常规算法,出现有序用二分查找。
class Solution:
def GetNumberOfK(self, data, k):
# write code here
if len(data)==0:
return 0
count=0
low=0
high=len(data)-1
while low<high:
mid=(low+high)//2
if data[mid]==k:
count+=1
elif data[mid]<k:
low=mid+1
else:
high=mid-1
return count
直接用常规的二分查找,运行超时,需要进一步改进。因为有序所以查找到的k如果数值相同,肯定在周围,而上法必将复杂。所以我们只用二分查找定位其位置而不直接统计次数,位置确定后再通过左右数值判断次数。
class Soluton:
def BinarySearch(self,data,mlen,k):
low=0
high=mlen-1
while low<high:
mid=(low+high)//2
if data[mid]==k:
return mid
elif data[mid]<k:
low=mid+1
else:
high=mid-1
return -1
def GetNumberOfK(self,data,k):
mlen=len(data)
index=self.BinarySearch(data,mlen,k)
if index==-1:
return 0
count=1
for i in range(1,mlen):
if index+i<mlen and data[index+i]==k:
count+=1
if index-i>=0 and data[index-i]==k:
count+=1
return count