【LeetCode】 单调队列结构解决滑动窗口问题

单调队列结构解决滑动窗口问题

单调队列这个数据结构主要可以解决滑动窗口相关的问题。

LeetCode 239

【LeetCode】 单调队列结构解决滑动窗口问题_第1张图片
使用单调队列,由于单调队列的特点先进先出,对头尾进行操作,所以单调队列内部使用双链表LinkedList实现头尾的增减。


class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        //利用单调队列的先进先出特点。
        MonotonicQueue window = new MonotonicQueue();
        //保存结果
        List <Integer> res = new ArrayList<>();
        for(int i = 0;i<nums.length;i++){
            if(i < k-1 ){
                //先把当前窗口内的元素加入。
                window.push(nums[i]);
            }else {
                //窗口向前滑动
                //移入新元素
                window.push(nums[i]);
                res.add(window.max());
                //移出窗口内的最后一个元素
                window.pop(nums[i-k+1]);
            }
        }
        //ArrayList转换为int数组
        int [] ret = new int [res.size()];
        for(int i=0;i<res.size();i++){
            ret[i] = res.get(i);
        }
        return ret;
    }
//构建单调队列数据结构
class MonotonicQueue{
    //LinkedList底层使用双向链表
    private LinkedList <Integer> q =new LinkedList<>();
    //加入元素
    public void push(int nums){
        //删除所有小于nums的值。
        while(!q.isEmpty() && q.getLast()<nums){
            q.pollLast();
        }
        q.addLast(nums);
    }
    //获取当前窗口内最大元素。
    public int max(){
        return q.getFirst();
    }
    //移出元素
    public void pop(int nums){
        if(nums == q.getFirst()){
            q.pollFirst();
        }
    }
}
}

写在最后⭐
博主也是边学习边写作,如有异议敬请指出~
如果喜欢这篇文章的话,别忘了给博主点一个赞关注⭐哟!
你的关注就是对我的最大鼓励!

你可能感兴趣的:(LeetCode刷题笔记,leetcode,数据结构,算法)