給你一個整數數組?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