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