牛客-剑指offer系列题解:数字在排序数组中出现的次数

记录刷题的过程。牛客和力扣中都有相关题目,这里以牛客的题目描述为主。该系列默认采用python语言。
1、问题描述:
统计一个数字在排序数组中出现的次数。

2、数据结构:
二分查找

3、题解:
方法1:暴力法
遍历,如果找到相等的,就累加1.

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

方法2:
两次二分查找
二分查找模板请参考小结系列——二分查找模板小结(三种:第一种基础,推荐掌握第二种,第三种是第二种的变体)

# -*- coding:utf-8 -*-
class Solution:
    def GetNumberOfK(self, data, k):
        # write code here
        left, right = 0, len(data) - 1
        while left <= right:
            mid = left + (right - left) // 2
            if data[mid] < k:
                left = mid + 1
            elif data[mid] > k:
                right = mid - 1
            else:
                right = mid - 1
        if left >= len(data) or data[left] != k:
            l = -1
        l = left
        # 寻找右边界
        left, right = 0, len(data) - 1
        while left <= right:
            mid = left + (right - left) // 2
            if data[mid] < k:
                left = mid + 1
            elif data[mid] > k:
                right = mid - 1
            else:
                left = mid + 1
        if right < 0 or data[right] != k:
            r = -1
        r = right
        if l == -1 and r == -1:
            return 0
        return r - l + 1

封装一下,寻找两次右边界

# -*- coding:utf-8 -*-
class Solution:
    def GetNumberOfK(self, data, k):
        # write code here
        #整合
        def find_right(data,k):
            left, right = 0, len(data) - 1
            while left <= right:
                mid = left + (right - left) // 2
                if data[mid] < k:
                    left = mid + 1
                elif data[mid] > k:
                    right = mid - 1
                else:
                    left = mid + 1
            return right
        return find_right(data, k) - find_right(data, k - 1)

4、复杂度分析:
方法1:
时间复杂度都为O(N)
空间复杂度都为O(1)
方法2:
时间复杂度:O(logN)
空间复杂度:O(1)

你可能感兴趣的:(牛客-剑指offer系列题解)