剑指 重复数字个数

数字在升序数组中出现的次数

http://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2

可以通过循环O(n),二分O(logn) 二分可以直接递归,也可以直接找左右边界,做差。

# -*- coding:utf-8 -*-
class Solution:
#     def __init__(self):
#         self.count=0
    def GetNumberOfK(self, data, k):
        # write code here
#         count=0
#         for i in range(len(data)):
#             if data[i]==k:
#                 while  i<len(data) and data[i]==k:
#                     count+=1
#                     i+=1
#                 return count
#         return count

#         def binary_search(left,right):


#             if left>right:return 

#             mid=(right-left)//2+left
#             if data[mid]<k:
#                 binary_search(mid+1, right)
#             elif data[mid]>k:
#                 binary_search(left, mid-1)
#             elif data[mid]==k:
#                 self.count+=1
#                 binary_search(left, mid-1)
#                 binary_search(mid+1, right)

#         binary_search(0, len(data)-1)
#         return self.count 
#         if len(data)==0:
#             return 0
        left=0
        right=len(data)-1
        while left<=right:
            mid=(right-left)//2+left
            if data[mid]<k:
                left=mid+1
            elif data[mid]>k:
                right=mid-1
            elif data[mid]==k:
                right=mid-1
        left_bound=left 
        #if data[left_bound]!=k:return 0

        left=0
        right=len(data)-1
        while left<=right:
            mid=(right-left)//2+left
            if data[mid]<k:
                left=mid+1
            elif data[mid]>k:
                right=mid-1
            elif data[mid]==k:
                left=mid+1

        right_bound=left

        return right_bound-left_bound

通过二分递归求解重复个数,把函数当作求一定区域内重复数字个数的函数,这样每次函数返回 count,把count也作为参数传入,函数返回值需要赋值给count,在mid值等于k时,我们需要让count+=1,然后继续在左边界和右边界寻找,因为count作为参数在函数里,动态增加,所以不用再赋值的时候count+=函数返回值,因为当前值已经是在之前的count基础上增加的了。

        def binary_search(left,right,count):


            if left>right:return count

            mid=(right-left)//2+left
            if data[mid]<k:
               count= binary_search(mid+1, right,count)
            elif data[mid]>k:
                count=binary_search(left, mid-1,count)
            elif data[mid]==k:
                count+=1
                count=binary_search(left, mid-1,count)
                count= binary_search(mid+1, right,count)
            return count

        if len(data)==0:
            return 0
        return binary_search(0, len(data)-1,0)
全部评论

相关推荐

03-26 15:18
已编辑
华北水利水电大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务