剑指 Offer 59 - I. 滑动窗口的最大值 + 双指针 + 双端队列
剑指 Offer 59 - I. 滑动窗口的最大值
Offer_59_1
题目详情
方法一:暴力方法+双指针
package com.walegarrett.offer;
/**
* @Author WaleGarrett
* @Date 2021/2/12 18:06
*/
import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;
/**
* 题目详情:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
*/
/**
* 方法一:暴力法 + 左右指针
*/
public class Offer_59_1 {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || nums.length==0)
return new int[0];
int len = nums.length;
int[] result = new int[len-k+1];
int cnt = 0;
for(int l=0,r=k-1;r<len;l++,r++){
int max=-0x3f3f3f3f;
for(int i=l;i<=r;i++){
max = Math.max(max, nums[i]);
}
result[cnt++] = max;
}
return result;
}
}
方法二:使用双端队列
/**
* 方法二:使用双端队列维护滑动窗口的最大值
*/
class Offer_59_1_2 {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || nums.length==0)
return new int[0];
int len = nums.length;
int[] result = new int[len-k+1];
Deque<Integer> deque = new LinkedList<>();
for(int l=1-k,r=0;r<len;l++,r++){
if(l>0 && deque.peekFirst() == nums[l-1])
deque.pollFirst();//删除窗口左边的元素
while(!deque.isEmpty() && deque.peekLast()<nums[r]){
deque.pollLast();//保持deque递减
}
deque.addLast(nums[r]);
if(l>=0)
result[l] = deque.peekFirst();
}
return result;
}
}
参考题解:面试题59 - I. 滑动窗口的最大值(单调队列,清晰图解)
Either Excellent or Rusty