码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-09-24 13:43:18      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:bubuko   inf   复杂   有一个   插入   时间   while   整型   分享图片   

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

 

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

标签:bubuko   inf   复杂   有一个   插入   时间   while   整型   分享图片   

原文地址:https://www.cnblogs.com/Lee-yl/p/9695203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!