• 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;
        }
    }
  • 相关阅读:
    图书管理系统
    关键路径
    最短路径

    最小生成树、最短路径
    Huffman编码
    LA 3401
    UVA 10881
    OI 刷题记录——每周更新
    4396: [Usaco2015 dec]High Card Wins
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/14221634.html
Copyright © 2020-2023  润新知