LeetCode 239. 滑动窗口最大值
天津科技大学第六届科技文化节算法设计大赛第17题
难度:困难
题目:
给你一个整数数组 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 <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sliding-window-maximum
解题思路:
- 解法1:滑动数组,在每个状态里进行归并(冒泡/快速/堆)排序,取最大值加入列表
- 解法2:滑动数组,使用max()方法直接获取
- 问题:大数据量时会运行超时,这就是本题看似简单实际上困难之处
源代码
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
def merge(list_left, list_right):
# 两个数组的起始下标
l, r = 0, 0
new_list = []
while l < len(list_left) and r < len(list_right):
if list_left[l] <= list_right[r]:
new_list.append(list_left[l])
l += 1
else:
new_list.append(list_right[r])
r += 1
new_list += list_left[l:]
new_list += list_right[r:]
return new_list
def merge_sort(mylist):
"""归并排序
mylist: 待排序数组
return: 新数组list
"""
if len(mylist) <= 1:
return mylist
mid = len(mylist) // 2
list_left = merge_sort(mylist[:mid])
list_right = merge_sort(mylist[mid:])
return merge(list_left, list_right)
alist=[]
while(len(nums)>=k):
snums=merge_sort(nums[0:k])
alist.append(snums[-1])
nums.remove(nums[0])
return alist