239. 滑动窗口最大值
Difficulty: 困难
给你一个整数数组 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 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
示例 2:
输入:nums = [1], k = 1
输出:[1]
示例 3:
输入:nums = [1,-1], k = 1
输出:[1,-1]
示例 4:
输入:nums = [9,11], k = 2
输出:[11]
示例 5:
输入:nums = [4,-2], k = 2
输出:[4]
提示:
1 <= nums.length <= 10<sup>5</sup>
-10<sup>4</sup> <= nums[i] <= 10<sup>4</sup>
1 <= k <= nums.length
Solution
方法一:
1、判断k为1或者为数组长度大小时的特殊情况
2、1<k<len(nums)
使用max函数直接求去数组某段的最大值
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
ans = []
n = len(nums)
if(k==1):
return nums
if(k>=n):
ans.append(max(nums))
return ans
for i in range(n-k+1):
t = max(nums[i:i+k])
ans.append(t)
return ans
但是这种方法超时了。
方法二
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
n = len(nums)
if(n==0):
return []
if(k==1):
return nums
if(k>n):
return [max(nums)]
window , res = [],[] #window是纪录最大值的索引
for i, num in enumerate(nums):
if i>=k and window[0]<=i-k: #最大元素已经访问过并在窗口之外了
window.pop(0) #弹出第一个元素
while window and nums[window[-1]]<=num: #当一个新的元素与之前窗口的最大进行比较,并移除小于新元素的值 的索引
window.pop() #弹出最后一个元素
window.append(i) #在末尾加数
if i>=k-1:
res.append(nums[window[0]])
return res