当前位置: 面试刷题>> 滑动窗口的最大值 (经典算法题500道)


### 题目描述 给定一个数组 `nums` 和一个滑动窗口的大小 `k`,请找出所有滑动窗口里元素的最大值。 **示例**: 输入: `nums = [1,3,-1,-3,5,3,6,7]`,`k = 3` 输出: `[3, 3, 5, 5, 6, 7]` 解释: - 第一个窗口是 `[1, 3, -1]`,最大值是 3。 - 第二个窗口是 `[3, -1, -3]`,最大值是 3。 - 第三个窗口是 `[-1, -3, 5]`,最大值是 5。 - 第四个窗口是 `[-3, 5, 3]`,最大值是 5。 - 第五个窗口是 `[5, 3, 6]`,最大值是 6。 - 第六个窗口是 `[3, 6, 7]`,最大值是 7。 ### PHP 示例代码 ```php function maxSlidingWindow($nums, $k) { $window = new SplMaxHeap(); $result = []; $left = 0; for ($right = 0; $right < count($nums); $right++) { // 维护窗口内最大堆 if ($window->count() && $window->top() <= $left) { $window->extract(); // 移除窗口外的元素 } $window->insert($nums[$right]); // 窗口形成 if ($right - $left + 1 == $k) { $result[] = $window->top(); $window->extract($nums[$left]); // 移除窗口左边界的元素 $left++; } } return $result; } // 注意:PHP 标准库中没有直接的 Max Heap 实现,这里假设使用 SplMaxHeap 或自定义实现 ``` ### Python 示例代码 ```python from collections import deque def maxSlidingWindow(nums, k): window = deque() result = [] for i in range(len(nums)): # 移除窗口左边界比当前元素小的所有元素 while window and nums[window[-1]] < nums[i]: window.pop() window.append(i) # 窗口形成 if i >= k - 1: result.append(nums[window[0]]) # 移除窗口左边界的索引 if window[0] <= i - k: window.popleft() return result # 示例调用 nums = [1,3,-1,-3,5,3,6,7] k = 3 print(maxSlidingWindow(nums, k)) ``` ### JavaScript 示例代码 ```javascript function maxSlidingWindow(nums, k) { const deque = []; const result = []; for (let i = 0; i < nums.length; i++) { // 移除所有比当前元素小的元素 while (deque.length > 0 && nums[deque[deque.length - 1]] < nums[i]) { deque.pop(); } deque.push(i); // 窗口形成 if (i >= k - 1) { result.push(nums[deque[0]]); // 移除窗口左边界的索引 if (deque[0] <= i - k) { deque.shift(); } } } return result; } // 示例调用 const nums = [1,3,-1,-3,5,3,6,7]; const k = 3; console.log(maxSlidingWindow(nums, k)); ``` **码小课**网站中有更多关于算法和数据结构的相关内容分享,欢迎大家学习交流。