给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。

思路:

class Solution:
    def maxInWindows(self, num, size):
        # write code here
        if not num:
            return []
        if size ==0:
            return []
        if len(num)==1:
            return num
        temp,res = [0],[]
        #数组temp中存放着当前窗口的最大值,和按需排列好的次大值,
        # 这些次大值在数组中的位置只能是位于最大之后的,
        # 数组 temp 的最大规模为 size -1。
        for i in range(len(num)):
            # temp[0]中记录第一个最大值的标号(位置) 
            if i-temp[0]>size-1: #代表第一个最大值的位置到当前位置,超出了长度为(size-1)的选定框
                temp.pop(0)#所以去掉第一个最大值
            while len(temp) !=0 and num[i] >= num[temp[-1]]:#当num当前的值大于或等于num次大值后,替换次大值
                temp.pop()
            temp.append(i)
            if i>=size-1:#如果当前坐标大于选定框长度,则将最大值放入res表
                res.append(num[temp[0]])
        return res
01-08 15:45