题目描述:
解法1:
这种解法思路比较简单。首先构造双指针,一个在前,一个在后,这样就可以构成一个滑动窗口。因为滑动窗口的大小是k,因此我们也可以使用一个指针来完成。一个指针为i,一个指针为i+k-1;只要后指针还没到达数组底部,每次前后指针都同时前移一个单位。然后我们通过for循环比较出窗口中元素的最大值,并记录下来。最后返回记录数组即可。
class Solution {
int count = 0;
public int[] maxSlidingWindow(int[] nums, int k) {
if(k > nums.length || nums.length == 0) return new int[0];
int i = 0;
int[] res = new int[nums.length - k + 1];
while(i + k - 1 <= nums.length - 1){
int max = nums[i];
for(int j = i; j <= i + k - 1; j++){
if(nums[j] > max) max = nums[j];
}
res[count] = max;
i++; count++;
}
return res;
}
}
解法2:
这种解法是通过队列去解决它。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 0 || k == 0) return new int[0];
Deque<Integer> deque = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
for(int i = 0; i < k; i++) { // 未形成窗口
while(!deque.isEmpty() && deque.peekLast() < nums[i])
deque.removeLast();
deque.addLast(nums[i]);
}
res[0] = deque.peekFirst();
for(int i = k; i < nums.length; i++) { // 形成窗口后
if(deque.peekFirst() == nums[i - k])
deque.removeFirst();
while(!deque.isEmpty() && deque.peekLast() < nums[i])
deque.removeLast();
deque.addLast(nums[i]);
res[i - k + 1] = deque.peekFirst();
}
return res;
}
}