栈和队列----算法

Posted lee-yl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈和队列----算法相关的知识,希望对你有一定的参考价值。

一、题目:生成窗口最大值数组(要求时间复杂度为O(N))

有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。

技术分享图片

技术分享图片

思路:

来自 https://blog.csdn.net/qq_32583189/article/details/53055618?utm_source=copy

技术分享图片

滑动窗口的最大值总是保存在队列首部队列里面的数据总是从大到小排列

当遇到比当前滑动窗口最大值更大的值时,则将队列清空,并将新的最大值插入到队列中。

如果遇到的值比当前最大值小,则直接插入到队列尾部。

每次移动的时候需要判断当前的最大值是否在有效范围,如果不在,则需要将其从队列中删除。

由于每个元素最多进队和出队各一次,因此该算法时间复杂度为O(N)。

代码:

技术分享图片

def getMaxWindow(arr, w):

    if arr == None or w < 1 or len(arr) < w:
        return None

    deque = []
    res = []

    for i in range(len(arr)):
#若队列不为空 且 队尾 比 当前元素小,则将队尾数据删除
        while deque and arr[deque[-1]] <= arr[i]:
            deque.pop()
#否则【队列为空】或者 【当前元素比队尾元素小】,将当前元素加入队列中
        deque.append(i)
#如果队首元素不在滑动窗口范围内,则删除队首元素。
        if deque[0] <= i - w:
            deque.pop(0)
#将结果加入res中
        if i-w+1 >= 0:
            res.append(arr[deque[0]])
    return res

 
arr = [4,3,5,4,3,3,6,7]
w = 3
getMaxWindow(arr, w)

 

以上是关于栈和队列----算法的主要内容,如果未能解决你的问题,请参考以下文章

考研数据结构与算法栈和队列

算法:栈和队列

《线性表的插入和删除算法实现》以及《栈和队列的插入和删除算法实现》的c语言代码

数据结构与算法学习笔记栈和队列

数据结构与算法学习笔记 栈和队列Ⅰ

浅谈算法和数据结构:栈和队列