给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6 7 51 3 -1 -3 [5 3 6] 7 61 3 -1 -3 5 [3 6 7] 7
示例 2:
输入:nums = [1], k = 1 输出:[1]
class Solution(object):def maxSlidingWindow(self, nums, k):""":type nums: List[int]:type k: int:rtype: List[int]"""def push(x,max_queue):while max_queue:if max_queue[-1]<x:del max_queue[-1]else:breakmax_queue+=[x]# print(max_queue)def pop(x,max_queue):if max_queue[0]==x:del max_queue[0]res= []max_queue = []for i in range(min(len(nums),k)):push(nums[i],max_queue)res.append(max_queue[0])for i in range(k,len(nums)):pop(nums[i-k],max_queue)push(nums[i],max_queue)res.append(max_queue[0])return res
主要难点是原本复杂度是nk,现在我想变成n,怎么办呢,自己设计一个有限队列,保存最大的元素,设计oush和pop的算法。push逻辑是push一个吧前面比他小的删除,pop的逻辑是判断队伍第一个是不是该pop的元素,如果是就pop