zoukankan      html  css  js  c++  java
  • [程序员代码面试指南]栈和队列-生成窗口最大值数组(单调队列)

    问题描述

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

    解题思路

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

    相关知识

    单调队列

    • 单调队列是单调递增或者是单调递减的一种队列。例如一个递增队列,若将数列1 6 5 3 8放入队列中,则队列的每一步变化为:1、1 6、1 5、1 3、1 3 8 。每当放入的元素使得队列不在单调,则弹出队尾的元素,直到使得队列元素单调。
    • 单调队列满足两个性质
      • 1.单调队列必须满足从队头到队尾的严格单调性。?
      • 2.排在队列前面的比排在队列后面的要先进队。

    代码

    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;
    	}
    }
    

    参考链接

    https://www.cnblogs.com/RisingGods/p/9426127.html

  • 相关阅读:
    springmvc
    POJ 3683 Priest John's Busiest Day
    POJ 3678 Katu Puzzle
    HDU 1815 Building roads
    CDOJ UESTC 1220 The Battle of Guandu
    HDU 3715 Go Deeper
    HDU 3622 Bomb Game
    POJ 3207 Ikki's Story IV
    POJ 3648 Wedding
    HDU 1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10865207.html
Copyright © 2011-2022 走看看