21.1.2 leetcode239滑动窗口

题目链接:https://leetcode-cn.com/problems/sliding-window-maximum/

题意:在一个数组上有一个长度为k的滑动窗口,每次向右移一位,求滑动窗口的最大值。

分析:首先要明确一个概念,每次滑动窗口加入一个值后,当前窗口内所有比它小的值都不可能当最大值了。所以我们可以用一个单调队列来做,当每读取一个新值,如果此时队尾都比他大(因为单增所以前面所有值都比他大),就直接放弃,不可能成为最大值,否则就把当前队列中每一个比它小的值全部丢掉,之后加入这个新值。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int head=0,tail=-1;
        int len = nums.length;
        int[] q = new int[len];
        int[] p = new int[len];
        int[] ans = new int[len-k+1];
        for(int i=0;i<len;i++){
            q[i]=0;
            p[i]=0;
        }
        for(int i=0;i<len;i++){
            while(head<=tail&&q[tail]<=nums[i])tail--;
            q[++tail]=nums[i];p[tail]=i;
            while(p[head]<=i-k)head++;
            if(i>=k-1) ans[i-k+1]=q[head];
        }
        return ans;
    }
}

 

posted @ 2021-01-02 10:03  清酒令  阅读(67)  评论(0编辑  收藏  举报