本题来自左神《程序员面试代码指南》“生成窗口最大值数组”题目。

题目

有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。

例如,数组为[4,3,5,4,3,3,6,7],窗口大小为3时:

               窗口数组               最大值  [4  3  5] 4  3  3  6  7        54 [3  5  4] 3  3  6  7         54  3 [5  4  3] 3  6  7         54  3  5 [4  3  3] 6  7         44  3  5  4 [3  3  6] 7         64  3  5  4  3 [3  6  7]        7

如果数组长度为 n,窗口大小为 w,则一共产生 n-w+1 个窗口的最大值。

请实现一个函数,

  • 输入:整型数组 arr,窗口大小为 w;
  • 输出:一个长度为 n-w+1 的数组 res,res[i] 表示每一种窗口状态下的最大值。

以本题为例,结果应该返回[5,5,5,4,6,7]

题解

思路总结:每一次从 队尾小于等于 当前元素的弹出




代码


import java.util.LinkedList;public class Main {public static int[] getMaxWindow(int[] arr, int w) {if (arr == null || w < 1 || arr.length < w) {return null;}LinkedList<Integer> qmax = new LinkedList<Integer>();int[] res = new int[arr.length - w + 1];int index = 0;for (int i = 0; i < arr.length; i++) {while (!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[i]) { // 一直弹出队尾位置,直到队尾对应元素大于当前元素为止qmax.pollLast();}qmax.addLast(i); // 放入当前元素if (qmax.peekFirst() == i - w) { // 如果qmax对头下标过期(已在当前窗口覆盖范围之外),则弹出对头下标qmax.pollFirst();}if (i >= w - 1) { // 如果当前i及其以前的元素满足一个窗口大小,则记录当前窗口的最大值res[index++] = arr[qmax.peekFirst()];}}return res;}// for testpublic static void printArray(int[] arr) {for (int i = 0; i != arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}public static void main(String[] args) {int[] arr = {4, 3, 5, 4, 3, 3, 6, 7};int w = 3;printArray(getMaxWindow(arr, w));}
}

运行结果

5 5 5 4 6 7

左神算法:生成窗口最大值数组(Java版)相关推荐

  1. 栈和队列之生成窗口最大值数组

    package com.chenyu.zuo.stackAndQueue;import java.util.LinkedList;/*** 题目:有一个整形数组,arr和一个大小为w的窗口从数组的最左 ...

  2. 左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)

    本题来自左神<程序员面试代码指南>"最大值减去最小值小于或等于num的子数组的数量"题目. 题目 给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况: ...

  3. 左神算法:求最大子矩阵的大小(Java版)

    本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...

  4. JAVA算法:解救小哈(JAVA版)

    JAVA算法:解救小哈(JAVA版) 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那 ...

  5. 左神算法:未排序正数数组中累加和为给定值的最长子数组长度(Java版)

    本题来自左神<程序员代码面试指南>"未排序正数数组中累加和为给定值的最长子数组长度"题目. 题目 牛客OJ:未排序数组中累加和为给定值的最长子数组长度 题解 本文提供的 ...

  6. 左神算法:在二叉树中找到累加和为指定值的最长路径长度(Java版)

    本题来自左神<程序员代码面试指南>"在二叉树中找到累加和为指定值的最长路径长度"题目. 题目 给定一棵二叉树的头节点 head 和一个 32 位整数 sum,二叉树节点 ...

  7. 左神算法:可见的山峰对数量(有重复值的情况)(Java版)

    本题来自左神<程序员面试代码指南>"可见的山峰对数量"题目. 题目 牛客在线OJ:可见的山峰对数量(进阶) 一个不含有负数的数组可以代表一圈环形山,每个位置的值代表山的 ...

  8. 左神算法:调整搜索二叉树中两个错误的节点(Java版)

    本题来自左神<程序员代码面试指南>"调整搜索二叉树中两个错误的节点"题目. 题目 原问题: 一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再 ...

  9. 左神算法:将搜索二叉树转换成双向链表(Java版)

    本题来自左神<程序员代码面试指南>"将搜索二叉树转换成双向链表"题目. 题目 对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针:对双向链表的节点 ...

最新文章

  1. GitHub 高速上手 ---- 创建密钥,连接
  2. DNS服务器之简单配置(一)
  3. java intfilter_Java IntStream filter()用法及代码示例
  4. sony android电视关机,【索尼 KDL-48WM15B 48英寸 LED电视使用体验】通电|待机|关机|加载|设置_摘要频道_什么值得买...
  5. 连接 Microsoft Cloud App Security 的数据
  6. Eclipse使用————Working Set工作集
  7. KMP——怪盗基德的挑战书(hdu4552)
  8. java线程池服务ExecutorService
  9. 通俗了解神经网络如何避免陷入局部最优
  10. 谁有html制作3d浪漫相册有代码,3D相册制作代码
  11. 计算机网络-----IP地址分配
  12. C语言|厘米换算成英尺英寸
  13. JavaScript(6):回调函数
  14. 打开计算机网络自动连接,电脑如何自动连接上网 开机自动拨号连接宽带的方法【步骤】...
  15. 但行好事莫问前程 学习笔记
  16. 《微信小程序案例12》图片识别功能
  17. 灵活的Vue组件——原来这么简单
  18. 关于树莓派4B安装桌面控件wbar和conky解决报错的一种方案
  19. 《复联4》影评抓取+词云+情感分析
  20. 软件开发中的老问题——沟通

热门文章

  1. CodeForces - 1270C Make Good(思维+构造)
  2. (转)区间合并pushup函数模板
  3. UVA1601The Morning after Halloween 单向加双向bfs
  4. Unhandled promise rejection Error: errCode: -501007 invalid parameters | errMsg: Invalid Key Name: _
  5. HDU3113(工科数学分析之分解)
  6. POJ2369 置换群
  7. 视音频编解码学习工程:TS封装格式分析器
  8. 使用SQLite3存储和读取数据
  9. 使用MAP文件快速定位程序崩溃代码行
  10. GlobalAlloc全局内存的使用