剑指offer37-数字在排序数组中出现的次数

题目描述

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

示例

输入       [1,2,3,3,3,3,4,5],3

返回值    4

知识点回顾

数组、二分

代码

解法一:暴力循环

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

解法二:二分法,速度就会变成O(nlogn)。

二分法找出任何一个等于k的数组元素,记录下他的index

根据这个index向前查找所有等于k的元素数量

根据这个index向后查找所有等于k的元素数量

# -*- coding:utf-8 -*-
class Solution:
    def GetNumberOfK(self, data, k):
        # write code here
        lenth=len(data)
        a,b=0,lenth-1
        list1,list2=[],[]
        sum=0
        tmp=(b-a)//2
        while k!=data[tmp] :            #先找到任意一个等于k的元素
            if k>data[tmp]:
                a=tmp+1
            else:
                b=tmp
            tmp=a+(b-a)//2
        list1=data[a:tmp+1]
        list2=data[tmp+1:b+1]
        while list1 and list1[-1]==k:   #特别注意这里的数组越界问题
            sum+=1
            list1.pop()
        while list2 and list2[0]==k:
            sum+=1
            list2.pop(0)
        return sum
a=Solution()
a.GetNumberOfK([1,2,3,3,3,3],3)

 

#去掉两个列表之后复杂度还是很高
#
-*- coding:utf-8 -*- class Solution: def GetNumberOfK(self, data, k): # write code here lenth=len(data) a,b=0,lenth-1 sum=0 tmp=(b-a)//2 while k!=data[tmp] : #先找到任意一个等于k的元素 if k>data[tmp]: a=tmp+1 else: b=tmp tmp=a+(b-a)//2 while tmp>=0 and data[tmp]==k: sum+=1 tmp-=1 while tmp+sum+1<=lenth-1 and data[tmp+sum+1]==k: sum+=1 return sum

 

解法三:还是二分法,但是变成寻找上界和下界

 

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

 

 

posted @ 2020-12-03 21:01  foolangirl  阅读(70)  评论(0编辑  收藏  举报