用java语言实现以下代码:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。
时间: 2024-05-01 15:20:17 浏览: 113
以下是使用Java语言实现的代码:
```java
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0 || k == 0) {
return new int[0];
}
int n = nums.length;
int[] result = new int[n - k + 1];
Deque<Integer> deque = new LinkedList<>();
for (int i = 0; i < n; i++) {
while (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {
deque.pollFirst();
}
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
deque.pollLast();
}
deque.offerLast(i);
if (i - k + 1 >= 0) {
result[i - k + 1] = nums[deque.peekFirst()];
}
}
return result;
}
```
我们使用一个双端队列 deque 来保存当前窗口内的数字,每次向右移动窗口时,我们需要在 deque 中保证:
1. deque 中的元素下标在区间 [i-k+1, i] 内,即最左侧的元素下标为 i-k+1。
2. deque 中的元素按照从大到小的顺序排列,即 deque.peekFirst() 即为当前窗口内的最大值。
具体实现过程中,我们首先将 deque 中下标不在区间 [i-k+1, i] 内的元素从队首移除。然后我们将当前数字 nums[i] 与 deque 中的最后一个元素比较,如果 nums[i] 更大,则将 deque 中的最后一个元素移除,直到 deque 中的最后一个元素比 nums[i] 大或 deque 为空为止。最后,我们将 nums[i] 的下标加入 deque 中,这样保证了 deque 中的元素下标在区间 [i-k+1, i] 内,且按照从大到小的顺序排列。并且,如果当前 i>=k-1,即窗口的大小为 k 时,我们将 deque.peekFirst() 即为当前窗口内的最大值,将其保存到结果数组中。
最后,我们返回结果数组即可。
阅读全文