• 剑指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
  • 相关阅读:
    Redis-内存优化(一)
    window激活
    ArrayDeque原理详解
    CountDownLatch原理详解
    DelayQueue延迟队列原理剖析
    浅析PriorityBlockingQueue优先级队列原理
    修改QT库的路径
    数据同步Datax与Datax_web的部署以及使用说明
    HTTP头的Expires与Cache-control
    python生成随机数、随机字符串
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14076388.html
Copyright © 2020-2023  润新知