LeetCode-239-滑动窗口最大值

题目

LeetCode-239-滑动窗口最大值_第1张图片

思路

  1. API小能手表示可以先把第一个窗口加进去,然后加一个减一个用API求最大值即可。
  2. 然后就被卡时间了,果然不能取巧,想想有没有解决办法。
  3. 用一个双端队列存储数组的下标(为了方便取值)。
  4. 如果加入的数大于当前队首的值就弹出所有队列里的值且加入该数,如果大于队列中部分值,也弹出它们且加入该数,这样可以保证队列永远是从大到小排序的。
  5. 双端队列设立LR,首先令L=0,R增到规定的k后开始记录答案,每一次判断是否加入都要将L和R往后移一位,模拟窗口每次的滑动。
  6. 如果队首的下标值小于L的话,需要弹出队列里所有值,因为此时的“最大值”不在[L,R]范围内。

代码

    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums == null || nums.length<2) return nums;
        //创建双向队列
        LinkedList<Integer> queue = new LinkedList<>();
        //结果数组
        int[] result = new int[nums.length-k+1];
        //开始遍历 滑动窗口
        //其中i为R L因为从始至终和R都差着k个距离 可以默认为i-k
        for(int i=0;i<nums.length;i++){
            //需要从队列里弹出元素的情况:队列不为空 且传入的数大于队列中(部分也可以是全部)的数
            //将被比下去的数弹出
            while(!queue.isEmpty() && nums[queue.peekLast()]<=nums[i]){
                queue.pollLast();
            }
            //把当前数的下标加入
            queue.addLast(i);
            //判断当前队列中队首的值是否有效 当前窗口范围:[i-k+1,i]
            if(queue.peek() <= i-k) queue.poll();
            //如果窗口已经滑动到[0,k]了 则可以开始添加最大值ans
            if(i+1>=k) result[i+1-k]=nums[queue.peek()];
        }
        return result;
    }

你可能感兴趣的:(LeetCode,leetcode,算法,排序算法)