滑动窗口系列2-窗口内的最大值问题

 题目过于简单,就不多写了,直接上代码

package dataStructure.slideWindow;

import java.util.LinkedList;

/**
 * 窗口的宽度为k,窗口从左向右移动,求每次窗口内的最大值
 */
public class GetMaxWindow {

    public static int[] maxSlidingWindow(int[] nums, int k) {
        //合法性校验
        if(nums == null || nums.length == 0 || k > nums.length) {
            return null;
        }

        LinkedList maxQueue = new LinkedList();
        int[] result = new int[nums.length - k + 1];
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            //如果当前队列中有比当前要添加的值小的元素,弹出并且不再使用
            while(!maxQueue.isEmpty() && nums[maxQueue.peekLast()] <= nums[i]) {
                maxQueue.pollLast();
            }

            //到这里窗口中肯定只剩下k - 1个数了,剩下的数没有比当前数小的,直接把当前数挂在尾部
            maxQueue.addLast(i);
            //如果当前窗口的第一个数也就是最大值是马上要划过的(当前窗口是从第i-k+1到i),则过期第一个数(原数组第i - k)
            if(i - k == maxQueue.peekFirst()) {
                maxQueue.pollFirst();
            }
            //窗口划过的数字的总数超过k的时候,每次统计一个最大值
            if(i >= k - 1) {
                result[index ++] = nums[maxQueue.peekFirst()];
            }


        }

        return result;
    }

    public static void main(String[] args) {
        int[] nums = {7,2,4};//1,3,-1,-3,5,3,6,7
        int k = 2;
        int[] result = maxSlidingWindow(nums, k);
        for(int num : result) {
            System.out.println(num);
        }
    }


}

你可能感兴趣的:(Leetcode,大厂真题,高频面试题,算法,数据结构,leetcode)