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

  • 相关阅读:
    HttpClientUtil的工具类请求三方API
    Linux下使用docker搭建ftp服务器
    Springboot2.0.4整合Mybatisplus
    Springboot前后端分离项目,配置跨域
    Nokia S40 系统配置
    "Your profile could not be opened correctly" Google Chromium Browser 错误纠正
    CLR AppDomain
    iTunes下载提速
    Which Programming Language?
    linux下制作软盘镜像文件
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10865207.html
Copyright © 2011-2022 走看看