我是靠谱客的博主 合适月光,最近开发中收集的这篇文章主要介绍滑动窗口最大值(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;
    }
}

最后

以上就是合适月光为你收集整理的滑动窗口最大值(LeetCode239)---队列(Java)的全部内容,希望文章能够帮你解决滑动窗口最大值(LeetCode239)---队列(Java)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部