使用双端队列O(n)

滑动窗口的最大值

http://www.nowcoder.com/questionTerminal/1624bc35a45c42c0bc17d17fa0cba788

思路:
使用一个单调递减栈保存数组下标,用单调递减栈的原因是为了使栈的最左是当前窗口的最大值,如果用递增栈无法保证栈的右边是当前栈的最大值。
循环遍历如果数据过期就弹出保证当前栈的最左边是该窗口最大值的坐标。

import java.util.*;
public class Solution {
     public ArrayList<Integer> maxInWindows(int [] num, int size)
    {

        ArrayList<Integer> list = new ArrayList<>();
        LinkedList<Integer> stack = new LinkedList<>();
         if(size==0||num.length==0||size>num.length)return list;
        for (int i = 0; i < size; i++) {

            while(!stack.isEmpty()&&num[stack.peekLast()]<num[i]){
                stack.pollLast();
            }
            stack.add(i);
        }
        list.add(num[stack.peekFirst()]);
        for (int i = 1; i < num.length-size+1 ; i++) {
            while(!stack.isEmpty()&&i>stack.peekFirst()){
                stack.pollFirst();
            }
            while(!stack.isEmpty()&&num[stack.peekLast()]<num[i+size-1]){
                stack.pollLast();
            }
            stack.addLast(i+size-1);

            list.add(num[stack.peekFirst()]);

        }
        return list;

    }
}
全部评论
前两个while应该改成if,写while容易误导
1 回复 分享
发布于 2020-08-06 21:27
什么叫栈的最左和最右???
点赞 回复 分享
发布于 2021-10-20 13:15
好,和书上思路差不多
点赞 回复 分享
发布于 2020-04-13 22:54
清晰易懂,非常不错的java版本
点赞 回复 分享
发布于 2020-04-04 19:54

相关推荐

评论
12
5
分享

创作者周榜

更多
牛客网
牛客企业服务