滑动窗口最大值(LeetCode239)---队列(Java)

请添加图片描述

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
          //如果数组的长度为0或者k的值为0,那么直接返回0即可
          if(nums.length == 0 || k == 0){
              return new int[0];
          }
          //建立一个双端队列用于存放过程中的值
          Deque<Integer> deque = new  LinkedList<>();
          //存放结果的数组
          int[] res = new int[nums.length - k + 1];
          //刚开始滑动窗口里面没有k个元素,先用for移动滑动窗口,保证滑动窗口里面有k个元素
          for(int i = 0; i < k;i++){
          //想从队列的队头直接获取最大,就要保存队列里的元素是递减
          //如果当队列中不为空且遍历到的nums[i]大于队列中的最后一个元素时,
          //将队列中的最后一个元素移除,直到队列为空,或者遇到队列中的元素大于nums[i]
            while(!deque.isEmpty()&&deque.peekLast() < nums[i]){//while
                deque.removeLast();
            }
            //上述操作保证添加入队列里的值是单调递减以后,就可以num[i]加入到队列中
            deque.addLast(nums[i]);//addLast
          }
          //在第一个滑动窗口形成的时候,它头部的第一个元素就是最大
          res[0] = deque.peekFirst();

          int n =  nums.length ;

          for(int i = k;i < n;i++){
              //数组的第一个数不能和队列第一个数一样
              //比如数组是[1,-1],k = 1,如果没有这一步判断,那么res[0] = 1 ,res[1] = 1,但实际上res[1] = -1
              if(deque.peekFirst() == nums[i - k]){
                  deque.removeFirst();
              }
              //保证队列是单调递减的
              while(!deque.isEmpty()&&deque.peekLast() < nums[i]){//while
                  deque.removeLast();
              }
			  //保证递减后nums[i]将加入
              deque.addLast(nums[i]);
			  //因为这个for循环是从k开始的,要减去k,就回到res数组的原位了,上面已经算出了res数组的一个元素,res下标要往后移动一位
              res[i - k + 1] = deque.peekFirst();
          }
          //将最大值数组返回
          return  res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值