题解 | #数字在升序数组中出现的次数#

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

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

法一:类似#第一个只出现一次的字符# https://blog.nowcoder.net/n/6aa6f3ed254041a88572510af837616e

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param data int整型一维数组 
# @param k int整型 
# @return int整型
#
class Solution:
    def GetNumberOfK(self , data: List[int], k: int) -> int:
        #统计每个数字出现的次数
        mydict={} 
        for i in data:
            if i not in mydict:
                mydict[i]=1
            else:
                mydict[i]=mydict[i]+1                  
        #找到k出现的次数
        
        if k not in mydict:
            return 0
        return mydict[k]

时间复杂度:O(n)

空间复杂度:O(n)

法二:列表的count方法

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param data int整型一维数组 
# @param k int整型 
# @return int整型
#
class Solution:
    def GetNumberOfK(self , data: List[int], k: int) -> int:
        return data.count(k)

法三: 从头开始找到第一个值为k的元素,再计算连续的k的个数即可。缺点:没有利用好有序数组的特性。

时间复杂度:O(n)。

空间复杂度:O(1)。

法四:二分法.用二分查找找到k+0.5和k−0.5应该出现的位置,二者相减就是k出现的次数。 举例:找k=3出现的次数。

data: 1 2 3 3 3 3 4 5

indx: 0 1 2 3 4 5 6 7

3.5应该在indx=6的位置,2.5应该在indx=2的位置。

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param data int整型一维数组 
# @param k int整型 
# @return int整型
#
class Solution:
    def bisearch(self , data: List[int], k: int) -> int:
        left=0
        right=len(data)-1
        while left<=right:
            mid=(left+right)//2
            if data[mid]>k:
                right=mid-1
            elif data[mid]<k:
                left=mid+1
        return left
    def GetNumberOfK(self , data: List[int], k: int) -> int:
        # write code here
        return self.bisearch(data,k+0.5)-self.bisearch(data,k-0.5)

看到有序数组,就要立马想到用二分查找,一般都能解决问题并且优化时间复杂度。

时间复杂度 O(logn):二分法通常时间复杂度都是O(logn)

空间复杂度 O(1):只用到整数型的数据类型,常数项级别

全部评论

相关推荐

评论
点赞
1
分享
牛客网
牛客企业服务