剑指offer:Python 数字在排序数组中出现的次数 二分查找最佳实现方式

题目描述

统计一个数字在排序数组中出现的次数。

思路及Python实现

思路一:二分查找

  • 由于数组是排序数组,而且都是整数。因此不用查找k的左右位置,只需要找到 k-0.5 和 k+0.5 的插入位置,然后左右相减即可。既然是排序数组,那么就可以用二分法查找
class Solution:
    def find_k(self, data, k):
        left_index = 0
        right_index = len(data) - 1
        while left_index <= right_index:
            mid_index = (left_index + right_index) >> 1
            if data[mid_index] < k:
                left_index = mid_index + 1
            if k < data[mid_index]:
                right_index = mid_index - 1
        return right_index

    def GetNumberOfK(self, data, k):
        if not data:
            return 0
        else:
            return self.find_k(data, k + 0.5) - self.find_k(data, k - 0.5)


obj = Solution()
print(obj.GetNumberOfK([1, 2, 2, 2, 3, 5], 2))

直接找该值得最左和最右两个位置

class Solution:
    def get_left(self, data, k, left, right):
        while left <= right:
            mid = (left + right) // 2
            if data[mid] >= k:
                # 注意,传统的二分法没有等号,如果相等了,就直接返回mid了,但是这个有点特殊
                right = mid - 1
            else:
                left = mid + 1
        return left

    # 找data中最后一次出现k的下标
    def get_right(self, data, k, left, right):
        while left <= right:
            mid = (left + right) // 2
            if data[mid] > k:
                right = mid - 1
            else:  # 注意,其他情况要包括等于
                left = mid + 1
        return right

    def GetNumberOfK(self, data, k):
        # write code here
        left = 0
        right = len(data) - 1
        right_k = self.get_right(data, k, left, right)
        left_k = self.get_left(data, k, left, right)
        return right_k - left_k + 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值