[程序员代码面试指南]栈和队列-生成窗口最大值数组(双端队列)

Posted coding-gaga

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[程序员代码面试指南]栈和队列-生成窗口最大值数组(双端队列)相关的知识,希望对你有一定的参考价值。

问题描述

输入数组arr={4,3,5,4,3,3,6,7},窗口大小w=3,窗口由左向右移动,输出每个窗口最大值组成的数组。

解题思路

  • 数据结构:使用ArrayList模拟双端队列。
  • 遍历一遍arr,时间复杂度O(n)。具体地,
    • 队列队尾的位置对应的元素若不比当前位置对应元素大,则弹出,否则,将当前元素入队。
      -每次检查队首元素下标是否已超出以当前位置为结尾的窗口,超出则出队。

代码

import java.util.LinkedList;

public class Main {
    public static void main(String args[]) {
        int[] arr= {4,3,5,4,3,3,6,7};
        int w=3;
        int[] maxValArr=getWinMaxVal(arr,w);
        for(int i=0;i<maxValArr.length;++i) {
            System.out.println(maxValArr[i]);
        }
    }
    
    public static int[] getWinMaxVal(int[] arr,int w) {
        int[] maxValArr=new int[arr.length-w+1];
        LinkedList<Integer> maxQue=new LinkedList<>();
        for(int i=0;i<arr.length;++i) {
            while(!maxQue.isEmpty()&&arr[maxQue.peekLast()]<arr[i]) {
                maxQue.pollLast();
            }
            maxQue.addLast(i);
            while(maxQue.peekFirst()<=i-w) {
                maxQue.pollFirst();
            }
            if(i>=w-1) {
                maxValArr[i-w+1]=arr[maxQue.peekFirst()];
            }
        }
        return maxValArr;
    }
}

以上是关于[程序员代码面试指南]栈和队列-生成窗口最大值数组(双端队列)的主要内容,如果未能解决你的问题,请参考以下文章

《程序员面试指南》第一章 栈和队列 构造数组的MaxTree

栈和队列----算法

剑指Offer(栈和队列)-滑动窗口的最大值

剑指offer:滑动窗口的最大值(栈和队列)

《程序员面试指南》电子书下载

[程序员代码面试指南]数组和矩阵问题-数组中子数组的最大累乘积