队列(Queue)

队列的特点

特点:和栈不同,队列的最大特点是先进先出(FIFO),就好像按顺序排队一样。对于队列的数据来说,我们只允许在队尾查看和添加数据,在队头查看和删除数据

实现:可以借助双链表来实现队列。双链表的头指针允许在队头查看和删除数据,而双链表的尾指针允许我们在队尾查看和添加数据。

 

双端队列(Deque)

特点:双端队列和普通队列最大的不同在于,它允许我们在队列的头尾两端都能在 O(1) 的时间内进行数据的查看、添加和删除。

实现:与队列相似,我们可以利用一个双链表实现双端队列。

 

示例:给定一个数组以及一个窗口的长度 k,现在移动这个窗口,要求打印出一个数组,数组里的每个元素是当前窗口当中最大的那个数。

输入:nums = [1, 3, -1, -3, 5, 3, 6, 7],k = 3

输出:[3, 3, 5, 5, 6, 7]

 

复制代码
class Solution:
    def maxSlidingWindow(self, nums, k):
        d = collections.deque()    #建立一个双端队列
        out = []
        for i, n in enumerate(nums):    #遍历数组
            while d and nums[d[-1]] < n:    #检查到本窗口的值比当前值小,pop掉
                d.pop()
            d += i,    #把当前值加入窗口中
            #这样队列中第0位永远是最大的
            if d[0] == i - k:    #检查最大值是否已经不在窗口中,不在就丢掉,因为每一步都检查,所以不会漏
                d.popleft()    #第一个窗口看到本窗口内最后一个值的时候才能找到最大值,所以从k-1处开始记录结果
            if i >= k - 1:
                out += nums[d[0]]
        return out
复制代码

 

posted on   星河赵  阅读(263)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
历史上的今天:
2017-11-17 HTML5自定义属性之data-index

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示