剑指offer——数组在排序数组中出现的次数

记录次数,直接用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值