zoukankan      html  css  js  c++  java
  • 队列(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
  • 相关阅读:
    Android Studio教程-创建第一个项目Hello World
    java打jar包的几种方式详解
    低学历者如何逆袭
    strlen, wcslen, _mbslen, _mbslen_l, _mbstrlen, _mbstrlen_l, setlocale(LC_CTYPE, "Japanese_Japan")(MSDN的官方示例)
    select, poll, epoll
    KVM虚拟化知识的一些笔记
    在Windows系统上以C++打印出当前活动用户的环境变量
    日志组件解析
    Angular2案例rebirth开源
    视图
  • 原文地址:https://www.cnblogs.com/zhaoyingjie/p/13997363.html
Copyright © 2011-2022 走看看