剑指offer64.滑动窗口的最大值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_36811967/article/details/87931870

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

不能每次选取范围再比较,这样时间复杂度太高。可以创建一个队列,队列首部是最大值索引,每次要先去掉小于当前数的所有索引,再去掉滑动窗口外的索引:

# -*- coding:utf-8 -*-
class Solution:
    def maxInWindows(self, num, size):
        # write code here
        res, queue = [], []  # 结果,索引队列
        if size == 0:
            return res
        for i in range(len(num)):
            begin = i-size+1  # 开始的位置
            while queue and num[queue[-1]] < num[i]:  # 去掉小于i处数的所有索引
                queue.pop(-1)
            while queue and begin > queue[0]:  # 去掉过了的最大数索引
                queue.pop(0)
            queue.append(i)
            if begin >= 0:
                res.append(num[queue[0]])
        return res

猜你喜欢

转载自blog.csdn.net/sinat_36811967/article/details/87931870