美文网首页
生成窗口最大的数值组(栈和队列) 笔记

生成窗口最大的数值组(栈和队列) 笔记

作者: 王古 | 来源:发表于2018-09-30 16:12 被阅读0次

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

时间复杂度为O(N)

生成双端队列qmax,qmax中存放数组arr的下标

import java.util.LinkedList;

public class Problem_07_SlidingWindowMaxArray {

    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]) {  //peeklast() 检索但是不移除最后一个元素
                qmax.pollLast(); //检索并移除最后一个元素
            }
            qmax.addLast(i);
            if (qmax.peekFirst() == i - w) {
                qmax.pollFirst();
            }
            if (i >= w - 1) {
                res[index++] = arr[qmax.peekFirst()];
            }
        }
        return res;
    }

    // for test
    public 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));

    }

} 

结果:


image.png

相关文章

  • 生成窗口最大的数值组(栈和队列) 笔记

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

  • 剑指offer-64-栈和队列

    栈和队列 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2...

  • 栈&队列

    一、栈&队列总结 栈/队列的应用接雨水验证栈序列滑动窗口的最大值 栈/队列的特殊实现用两个栈实现队列用两个队列实现...

  • 每日一题之《剑指offer》64,65,66,67题

    第64题:滑动窗口的最大值 难易度:⭐⭐⭐ 解析:本题的思路是使用双端队列双端队列用来保存窗口最大数值的index...

  • 算法进阶二

    BFPRT算法: 介绍窗口以及窗口内最大值或最小值的更新结构(单调双向队列) 介绍单调栈结构

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 栈和队列

    用栈定义队列(出入栈) 用队列定义栈(数据队列和辅助队列)

  • LeetCode 239 滑动窗口最大值 Sliding Win

    有关栈、堆、队列的LeetCode做题笔记,Python实现 239. 滑动窗口最大值 Sliding Windo...

  • Algorithm小白入门 -- 队列和栈

    队列和栈队列实现栈、栈实现队列单调栈单调队列运用栈去重 1. 队列实现栈、栈实现队列 队列是一种先进先出的数据结构...

  • 栈和队列

    栈和队列 本质上是稍加限制的线性表 栈和队列定义 栈顺序栈定义 链栈结点定义 队列顺序队列 链队列链队类型定义 链...

网友评论

      本文标题:生成窗口最大的数值组(栈和队列) 笔记

      本文链接:https://www.haomeiwen.com/subject/qkywoftx.html