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

问题描述

输入数组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;
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/10865207.html

时间: 2024-11-07 00:43:43

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

[程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(双端队列)

题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每一个子数组都满足条件. 如果数组arr[i...j]不满足条件,则包含它的每一个数组都不满足条件. 数据结构:用i.j表示当前窗口,分别使用两个双端队列维护窗口的最大值和最小值. 具体地,每次更新两个双端队列,检查当前的窗口是否满足条件,满足则j++,不满足则cnt+=j-i,更新双端队列,i++,j不变.若

程序员代码面试指南 IT名企算法与数据结构题目最优解 ,左程云著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介  · · · · · ·这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化

左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈

[题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. [要求] 1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. [题解] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作.[要求]1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. 解题思路: 使用一个辅助栈,里面存的目前栈中的最小值 1 #pragma once 2 #inclu

左神算法书籍《程序员代码面试指南》——1_06用栈来求解汉诺塔问题

[问题] 汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间.求当塔有N层的时候,打印最优移动过程和最优移动总步数.例如,当塔数为两层时,最上层的塔记为1,最下层的塔记为2,则打印:Move 1 from left to mid Move 1 from mid to right Move 2 from left to midMove 1 from right to mid Move 1 from mid to le

《程序员代码面试指南》第八章 数组和矩阵问题 将正方形矩阵顺时针转动90

题目 将正方形矩阵顺时针转动90 java代码 package com.lizhouwei.chapter8; /** * @Description: 将正方形矩阵顺时针转动90 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:16 * @Modify by: * @ModifyDate: */ public class Chapter8_2 { public void rotate(int[][] matrix) { int tR = 0; i

《程序员代码面试指南》第八章 数组和矩阵问题 需要排序的最短子数组长度

题目 需要排序的最短子数组长度 java代码 package com.lizhouwei.chapter8; /** * @Description: 需要排序的最短子数组长度 * @Author: lizhouwei * @CreateDate: 2018/4/29 8:03 * @Modify by: * @ModifyDate: */ public class Chapter8_5 { public int getMinLength(int[] arr) { if (arr == null

《程序员代码面试指南》第八章 数组和矩阵问题 &quot;之&quot;字形打印矩阵

题目 "之"字形打印矩阵 java代码 package com.lizhouwei.chapter8; /** * @Description: "之"字形打印矩阵 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:53 * @Modify by: * @ModifyDate: */ public class Chapter8_3 { public void printMatrixZigZag(int[][] matri

《程序员代码面试指南》第八章 数组和矩阵问题 自然数数组的排序

题目 自然数数组的排序 java代码 package com.lizhouwei.chapter8; /** * @Description: 自然数数组的排序 * @Author: lizhouwei * @CreateDate: 2018/5/8 20:51 * @Modify by: * @ModifyDate: */ public class Chapter8_14 { public void sort(int[] arr) { int left = 0; int right = arr.

《程序员代码面试指南》第八章 数组和矩阵问题 不包含本位置值的累乘数组

题目 不包含本位置值的累乘数组 java代码 package com.lizhouwei.chapter8; /** * @Description: 不包含本位置值的累乘数组 * @Author: lizhouwei * @CreateDate: 2018/5/9 21:11 * @Modify by: * @ModifyDate: */ public class Chapter8_22 { public int[] product(int[] arr) { int[] res = new in