滑动窗口最大值 python 题解

 这是leetcode上的一道题,其算法之典型,可谓算法中的重中之重

我们来分析一下,反正就是用其他算法会超时,咱必须得用单调队列

下面介绍一下单调队列:

我最近学到了一个好习惯就是把算法用类封装起来,之后用对象调用:

so

我这里给出单调队列的算法:

class MonotonicQueue:#Monotonic adj.单调的
    from collections import deque
    #这个东西叫双向队列,也就是可以在两头操作这个东西
    def __init__(self, type, sub=[]):
        self.type = type == 'decrease'#逆序,或者叫单调递减 3 2 1这样
        #意思是type是一个bool型变量,当他是那个字符串的时候,就是True
        self.queue = self.deque()
        #queue是一个空的deque
        for i in sub:
            self.push(i)#这个push 是下面的一个方法
    def head(self):
        return self.queue[0]#取头

    def is_monotonic(self, x):#重点,判断插入x后是否是单调的
        tail = self.queue[-1]
        #首先取一下尾
        return tail >= x if self.type else tail <= x
        #你看,但是decrease的时候,再看x(待插入的数据)是不是比尾巴小,要是比尾巴小,那么tail >= x为真,此方法返回真
        #反之,increase  的时候 ,看看x是不是比尾巴大,以维持递增

    def push(self, x):
        while self.queue and not self.is_monotonic(x):#意思是非空,不单调
            self.queue.pop()#在队列(目前是单调的)中弹走一个数
            #并且这里是while 也就是可以一直弹 ,谈到空,或者非空且单调,有点绕是吧,因为单调了后面的条件就必不满足了

        self.queue.append(x)#清理干净后,也就是做完手术后,也就是前方序列单调且加入x也单调,就加x


    def pop(self, value):
        if self.head() == value:
            self.queue.popleft()
    #如果队头等于某值,弹队头,根据值的相同来弹队头进行遍历
class Solution:
    def maxSlidingWindow(self, nums, k):
        maxs = []
        decrease_queue = MonotonicQueue('decrease', nums[: k])#看似一行,其实特麻烦
        maxs.append(decrease_queue.head())
        #举个例子吧
        #decrease_queue此时是3,-1 maxs 是 3
        for old_left in range(len(nums) - k):#0-(5—1)遍历
            new_right = old_left + k
            old_left = nums[old_left]
            new_right = nums[new_right]
            decrease_queue.pop(old_left)
            decrease_queue.push(new_right)#有文章做.push方法复杂

            maxs.append(decrease_queue.head())#5遍5个值,第一个单摘出来了

        return maxs
if __name__=="__main__":
    s = Solution()
    a=[1,3,-1,-3,5,3,6,7]
    b=s.maxSlidingWindow(a,3)
    print(b)

前半部分我注释写的巨详细,后半部分太累了,改天写

写写心得吧,我感觉算法学习,是一个像电子跃迁的过程,我们是按能级分的,你势必从看基础知识到看懂基础知识,会看代码到看懂代码,写代码到写成代码,看似每天在努力,但是感觉自己毫无进步,其实我们的每一次努力都是为我们进行跃迁积蓄力量,当力量积蓄到一定程度的时候,突然出击,可能我们就到下一个能级了,但前提是力量足够强,突然要足够突然。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OD流水线是一种用于目标检测的深度学习模型,主要用于在图像或视频中识别和定位物体。它通过将输入图像或视频分成小块,并对每个块进行分类和定位,从而实现目标检测的功能。 Python题解是指使用Python编程语言来解决OD流水线中的问题。Python是一种简单易学、功能强大的编程语言,因其易读性和丰富的库而受到广泛应用。 在OD流水线的Python题解中,一般会使用相关的Python库和工具来实现目标检测的各个步骤。首先,需要使用OpenCV或PIL库加载和处理输入的图像或视频数据。然后,需要使用一种深度学习框架,例如TensorFlow或PyTorch,加载预训练的OD模型。接下来,将输入的图像数据传入模型中进行推理,并获取每个目标的类别和位置信息。最后,可以根据需要对检测到的目标进行后续处理,如绘制边界框、标注类别等。 在OD流水线的Python题解中,还可以使用其他辅助工具和技术来提升检测性能。例如,可以使用图像增强技术来提高输入图像的质量,或者使用非极大值抑制算法来去除重叠的边界框。此外,还可以根据具体应用场景进行模型微调或优化,以提高模型在特定数据集上的检测准确率和速度。 总之,OD流水线的Python题解是一种使用Python编程语言实现目标检测的方法。通过使用相关的Python库和工具,结合深度学习模型和其他辅助技术,可以实现高效、精确的目标检测功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值