代码随想录算法训练营 day13

滑动窗口最大值

如果不用数据结构,用双指针也可以解决,那要用数据结构的话,用什么类型的数据结构呢?使用单调队列

正解:

class MyQueue{
//      创建一个单调递减的队列
        Deque<Integer> deque=new LinkedList<>();
        //弹出元素时,要保证该元素是最大值且队列不为空
        void poll(int value){
            if(!deque.isEmpty() && value==deque.peek()){
                 deque.poll();
            }
        }
        //添加元素时,保证该元素比末尾的元素值大
        void add(int value){
            while(!deque.isEmpty() && value>deque.getLast()){
                deque.removeLast();
            }
            deque.add(value);
        }
        int peek(){
            return deque.peek();
        }
}

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
           if(nums.length ==1)
           return nums;

          //必须初始化大小
           int[] res=new int[nums.length-k+1];
           int index=0;

        //自定义队列
        MyQueue myQueue=new MyQueue();
        //将第一扇窗口里面的数字放入队列
        for(int i=0;i<k;i++){
            myQueue.add(nums[i]);
        }
        res[index++]=myQueue.peek();//这里就存放了第一个最大值
        for(int i=k;i<nums.length;i++){
             //如果能移除最前面的,说明最后面的新元素可以加入,这样就能保证每次队列里面都有三个数参与过,只是有些数因为不满足条件而未被写进去.
             myQueue.poll(nums[i-k]);
             myQueue.add(nums[i]);
             res[index++]=myQueue.peek();
        }

        return res;

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值