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

最初的想法是用二分法找到第一个等于k的索引,然后分别向左和向右找相同的元素来确定左边界和右边界
但是如果左边和右边的相同的元素特别多的话,就还要遍历很多次
于是想到再用两次二分法分别求出左边界和右边界
整体时间复杂度为O(logn)

# -*- coding:utf-8 -*-
class Solution:
    def GetNumberOfK(self, data, k):
        def get_first(data,l,r,k):
            while l<=r:
                mid=l+(r-l)//2
                if data[mid]==k and (mid==l or data[mid-1] != k):
                    return mid
                if data[mid]!=k:
                    l=mid+1
                else:
                    r=mid-1
        def get_last(data,l,r,k):
            while l<=r:
                mid=l+(r-l)//2
                if data[mid]==k and (mid==r or data[mid+1]!=k):
                    return mid
                if data[mid]!=k:
                    r=mid-1
                else:
                    l=mid+1
        l=0
        r=len(data)-1
        while l<=r:
            mid=l+(r-l)//2
            if data[mid]==k:
                return get_last(data,mid,r,k)-get_first(data,l,mid,k)+1
            if data[mid]<k:
                l=mid+1
            else:
                r=mid-1
        return 0
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务