mirror of
https://github.com/labuladong/fucking-algorithm.git
synced 2025-07-04 19:28:07 +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 >
|
<img src="../pictures/qrcode.jpg" width=200 >
|
||||||
</p>
|
</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