栈和队列(3)----算法

一、题目:生成窗口最大值数组(要求时间复杂度为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)

猜你喜欢

转载自www.cnblogs.com/Lee-yl/p/9695203.html