class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
}
};
239. 滑动窗口最大值
给你一个整数数组 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]
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length
原站题解
java 解法, 执行用时: 32 ms, 内存消耗: 58.3 MB, 提交时间: 2023-08-16 15:56:18
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int n = nums.length; Deque<Integer> deque = new LinkedList<Integer>(); for (int i = 0; i < k; ++i) { while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) { deque.pollLast(); } deque.offerLast(i); } int[] ans = new int[n - k + 1]; ans[0] = nums[deque.peekFirst()]; for (int i = k; i < n; ++i) { while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) { deque.pollLast(); } deque.offerLast(i); while (deque.peekFirst() <= i - k) { deque.pollFirst(); } ans[i - k + 1] = nums[deque.peekFirst()]; } return ans; } }
golang 解法, 执行用时: 240 ms, 内存消耗: 9.2 MB, 提交时间: 2023-08-16 15:55:59
func maxSlidingWindow(nums []int, k int) []int { q := []int{} push := func(i int) { for len(q) > 0 && nums[i] >= nums[q[len(q)-1]] { q = q[:len(q)-1] } q = append(q, i) } for i := 0; i < k; i++ { push(i) } n := len(nums) ans := make([]int, 1, n-k+1) ans[0] = nums[q[0]] for i := k; i < n; i++ { push(i) for q[0] <= i-k { q = q[1:] } ans = append(ans, nums[q[0]]) } return ans }
python3 解法, 执行用时: 272 ms, 内存消耗: 31 MB, 提交时间: 2023-08-16 15:55:33
# 单调队列 class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: n = len(nums) q = collections.deque() for i in range(k): while q and nums[i] >= nums[q[-1]]: q.pop() q.append(i) ans = [nums[q[0]]] for i in range(k, n): while q and nums[i] >= nums[q[-1]]: q.pop() q.append(i) while q[0] <= i - k: q.popleft() ans.append(nums[q[0]]) return ans
java 解法, 执行用时: 96 ms, 内存消耗: 60.4 MB, 提交时间: 2023-08-16 15:55:03
// 优先队列 class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int n = nums.length; PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() { public int compare(int[] pair1, int[] pair2) { return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1]; } }); for (int i = 0; i < k; ++i) { pq.offer(new int[]{nums[i], i}); } int[] ans = new int[n - k + 1]; ans[0] = pq.peek()[0]; for (int i = k; i < n; ++i) { pq.offer(new int[]{nums[i], i}); while (pq.peek()[1] <= i - k) { pq.poll(); } ans[i - k + 1] = pq.peek()[0]; } return ans; } }
golang 解法, 执行用时: 252 ms, 内存消耗: 9.5 MB, 提交时间: 2023-08-16 15:54:41
var a []int type hp struct{ sort.IntSlice } func (h hp) Less(i, j int) bool { return a[h.IntSlice[i]] > a[h.IntSlice[j]] } func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) } func (h *hp) Pop() interface{} { a := h.IntSlice; v := a[len(a)-1]; h.IntSlice = a[:len(a)-1]; return v } func maxSlidingWindow(nums []int, k int) []int { a = nums q := &hp{make([]int, k)} for i := 0; i < k; i++ { q.IntSlice[i] = i } heap.Init(q) n := len(nums) ans := make([]int, 1, n-k+1) ans[0] = nums[q.IntSlice[0]] for i := k; i < n; i++ { heap.Push(q, i) for q.IntSlice[0] <= i-k { heap.Pop(q) } ans = append(ans, nums[q.IntSlice[0]]) } return ans }
python3 解法, 执行用时: 580 ms, 内存消耗: 40.5 MB, 提交时间: 2023-08-16 15:54:22
class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: n = len(nums) # 注意 Python 默认的优先队列是小根堆 q = [(-nums[i], i) for i in range(k)] heapq.heapify(q) ans = [-q[0][0]] for i in range(k, n): heapq.heappush(q, (-nums[i], i)) while q[0][1] <= i - k: heapq.heappop(q) ans.append(-q[0][0]) return ans
python3 解法, 执行用时: 728 ms, 内存消耗: 30.6 MB, 提交时间: 2023-08-16 15:52:57
class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: n = len(nums) prefixMax, suffixMax = [0] * n, [0] * n for i in range(n): if i % k == 0: prefixMax[i] = nums[i] else: prefixMax[i] = max(prefixMax[i - 1], nums[i]) for i in range(n - 1, -1, -1): if i == n - 1 or (i + 1) % k == 0: suffixMax[i] = nums[i] else: suffixMax[i] = max(suffixMax[i + 1], nums[i]) ans = [max(suffixMax[i], prefixMax[i + k - 1]) for i in range(n - k + 1)] return ans