题目描述
给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。
例如,如果输入数组[2, 3, 4, 2, 6, 2, 5, 1]及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为[4, 4, 6, 6, 6, 5]。
数据保证k大于0,且k小于等于数组长度。
解题思路
1、如果k等于nums数组的长度,则返回nums中最大值
2、如果小于nums数组长度,则可以先遍历前k个元素,找出最大的值的下标记作max_ind,再利用两个指针,头指针指向第k个元素,尾指针指向第2个元素,然后让两个指针同时往后走。如果头指针的值大于max_ind 指向的值,则更新max_ind;需要处理的特殊情况就是,尾指针值大于max_ind(此时滑动窗口已经不包含max_ind指向的最大值了),此时需要遍历滑动窗口的值,更新max_ind。
代码实现
class Solution(object):
def maxInWindows(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
n = len(nums)
if k == n:
max_n = nums[0]
for i in nums:
if i > max_n:
max_n = i
return [max_n]
max_ind = 0
for i in range(k): # 遍历前K个值
if nums[i] >= nums[max_ind]:
max_ind = i
pre = k # 头指针
rear = 1 # 尾指针
res = [nums[max_ind]]
while pre < n:
if rear > max_ind: # 尾指针超过max_ind
max_ind = rear
for i in range(rear, pre + 1):
if nums[i] >= nums[max_ind]:
max_ind = i # 在滑动窗口中更新max_ind
if nums[pre] >= nums[max_ind]:
max_ind = pre
res.append(nums[max_ind])
pre += 1
rear += 1
return res