mirror of
https://github.com/labuladong/fucking-algorithm.git
synced 2025-07-04 11:22:59 +08:00
Update 单调队列.md
This commit is contained in:
@ -210,4 +210,51 @@ vector<int> maxSlidingWindow(vector<int>& nums, int k) {
|
||||
<img src="../pictures/qrcode.jpg" width=200 >
|
||||
</p>
|
||||
|
||||
======其他语言代码======
|
||||
======其他语言代码======
|
||||
```java
|
||||
class Solution {
|
||||
public int[] maxSlidingWindow(int[] nums, int k) {
|
||||
int len = nums.length;
|
||||
// 判断数组或者窗口长度为0的情况
|
||||
if (len * k == 0) {
|
||||
return new int[0];
|
||||
}
|
||||
|
||||
/*
|
||||
采用两端扫描的方法
|
||||
将数组分成大小为 k 的若干个窗口, 对每个窗口分别从左往右和从右往左扫描, 记录扫描的最大值
|
||||
left[] 记录从左往右扫描的最大值
|
||||
right[] 记录从右往左扫描的最大值
|
||||
*/
|
||||
int[] left = new int[len];
|
||||
int[] right = new int[len];
|
||||
|
||||
for (int i = 0; i < len; i = i + k) {
|
||||
// 每个窗口中的第一个值
|
||||
left[i] = nums[i];
|
||||
// 窗口的最后边界
|
||||
int index = i + k - 1 >= len ? len - 1 : i + k - 1;
|
||||
// 每个窗口的最后一个值
|
||||
right[index] = nums[index];
|
||||
// 对该窗口从左往右扫描
|
||||
for (int j = i + 1; j <= index; j++) {
|
||||
left[j] = Math.max(left[j - 1], nums[j]);
|
||||
}
|
||||
// 对该窗口从右往左扫描
|
||||
for (int j = index - 1; j >= i; j--) {
|
||||
right[j] = Math.max(right[j + 1], nums[j]);
|
||||
}
|
||||
}
|
||||
|
||||
int[] arr = new int[len - k + 1];
|
||||
|
||||
// 对于第 i 个位置, 它一定是该窗口从右往左扫描数组中的最后一个值, 相对的 i + k - 1 是该窗口从左向右扫描数组中的最后一个位置
|
||||
// 对两者取最大值即可
|
||||
for (int i = 0; i < len - k + 1; i++) {
|
||||
arr[i] = Math.max(right[i], left[i + k - 1]);
|
||||
}
|
||||
|
||||
return arr;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
Reference in New Issue
Block a user