滑动窗口的最大值

本文介绍了如何找到数组中滑动窗口内的最大值,以及实现一个支持快速获取最小值的栈。此外,还展示了如何定义一个基本的队列数据结构。涉及数据结构与算法的应用,包括双端队列(deque)在滑动窗口问题中的使用,以及在栈中保持最小值的优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指 Offer 59 - I. 滑动窗口的最大值

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
在这里插入图片描述

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        if not nums:
            return []
        deque = collections.deque()   #非严格递减
        res=[]
        for i in range(0,k):  #0到k-1 一共k个数  此阶段 deque不用左出队
            while deque and deque[-1]<nums[i]:   #从后往前检查若小于nums[i]则出队
                deque.pop()
            deque.append(nums[i])   
        res.append(deque[0])   #窗口满啦 得到第一个窗口对应的最大值
        for i in range(k,len(nums)):   #此阶段窗口左侧有出队
            while deque and deque[-1]<nums[i]:
                deque.pop()
            deque.append(nums[i])
            if nums[i-k]==deque[0]:   #窗口左侧出队数字等于deque[0]时,deque需要左出队
                deque.popleft()
            res.append(deque[0])   #得到当前窗口内最大值
        return res

剑指 Offer 30. 包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

lass MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack=[]
        self.minatlast=[]   #只需记录当前最小值,


    def push(self, x: int) -> None:
        self.stack.append(x)
        if len(self.minatlast)==0 or self.minatlast[-1]>=x:   
        #self.minatlast[-1]>=x 等于时也入栈 stack=[0,1,0] minatlast=[0,0] pop then minatlast=[0]
            self.minatlast.append(x)
        else:
            pass     #因为出栈也是按顺序出栈,当前x永远不可能成为最小值不需要记录
        return

    def pop(self) -> None:
        if self.stack[-1]==self.minatlast[-1]:
            self.minatlast.pop()
        self.stack.pop()
        return

    def top(self) -> int:
        return self.stack[-1]


    def min(self) -> int:
        return self.minatlast[-1]



# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.min()

定义队列数据结构

class Queue(object):
    #定义一个空队列
    def __init__(self):
        self.items = []
    #队列(只能在队尾)添加一个元素
    def enqueue(self, item):
        self.items.append(item)
    #删除队列(只能在对头)一个元素
    def dequeue(self):
        self.items.pop(0)
    #判断队列是否为空
    def isEmpty(self):
        return(self.items == [])
    #清空队列
    def clear(self):
        del(self.items) #该队列就不存在了,而不是清空元素
    #返回队列项的数量
    def size(self):
        return(len(self.items))
    #打印队列
    def print(self):
        print(self.items)
if __name__ == '__main__':
    q = Queue()
    print(q.isEmpty())
    for i in range(5):
        q.enqueue(i)
    print(q.size())
    q.print()
    q.dequeue()
    q.print()
    q.clear()
    print(q)

Python 队列(Queue)用法

Python标准库中包含了四种队列,分别是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque

collections.deque

deque是双端队列(double-ended queue)的缩写,由于两端都能编辑,deque既可以用来实现栈(stack)也可以用来实现队列(queue)。

deque支持丰富的操作方法,主要方法如图:

在这里插入图片描述
deque也支持in操作符,可以使用如下写法:

q = collections.deque([1, 2, 3, 4])
print(5 in q)  # False
print(1 in q)  # True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值