题目描述
统计一个数字在升序数组中出现的次数。
示例
输入 [1,2,3,3,3,3,4,5],3
返回值 4
知识点回顾
数组、二分
代码
解法一:暴力循环
# -*- coding:utf-8 -*- class Solution: def GetNumberOfK(self, data, k): # write code here sum=0 for i in range(len(data)): if data[i]==k: sum+=1 return sum
解法二:二分法,速度就会变成O(nlogn)。
二分法找出任何一个等于k的数组元素,记录下他的index
根据这个index向前查找所有等于k的元素数量
根据这个index向后查找所有等于k的元素数量
# -*- coding:utf-8 -*- class Solution: def GetNumberOfK(self, data, k): # write code here lenth=len(data) a,b=0,lenth-1 list1,list2=[],[] sum=0 tmp=(b-a)//2 while k!=data[tmp] : #先找到任意一个等于k的元素 if k>data[tmp]: a=tmp+1 else: b=tmp tmp=a+(b-a)//2 list1=data[a:tmp+1] list2=data[tmp+1:b+1] while list1 and list1[-1]==k: #特别注意这里的数组越界问题 sum+=1 list1.pop() while list2 and list2[0]==k: sum+=1 list2.pop(0) return sum a=Solution() a.GetNumberOfK([1,2,3,3,3,3],3)
#去掉两个列表之后复杂度还是很高
# -*- coding:utf-8 -*- class Solution: def GetNumberOfK(self, data, k): # write code here lenth=len(data) a,b=0,lenth-1 sum=0 tmp=(b-a)//2 while k!=data[tmp] : #先找到任意一个等于k的元素 if k>data[tmp]: a=tmp+1 else: b=tmp tmp=a+(b-a)//2 while tmp>=0 and data[tmp]==k: sum+=1 tmp-=1 while tmp+sum+1<=lenth-1 and data[tmp+sum+1]==k: sum+=1 return sum
解法三:还是二分法,但是变成寻找上界和下界
# -*- coding:utf-8 -*- class Solution: def GetNumberOfK(self, data, k): # write code here a,b=0,len(data) while a<b: tmp=a+(b-1-a)//2 if data[tmp]<k: a=tmp+1 else: b=tmp left=a a,b=0,len(data) while a<b: tmp=a+(b-1-a)//2 if data[tmp]>k: b=tmp else: a=tmp+1 right=a return right-left