剑指 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. 滑动窗口的最大值(单调队列,清晰图解)

posted @ 2021-02-12 18:29  Garrett_Wale  阅读(91)  评论(0编辑  收藏  举报