当前位置: 面试刷题>> 滑动窗口的最大值 (经典算法题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));
```
**码小课**网站中有更多关于算法和数据结构的相关内容分享,欢迎大家学习交流。