剑指offer59a 滑动窗口的最大值

这题没做过类似的,挺难的。

核心思想是,使用一个双端队列记录滑动窗口中的潜在最大值。然后窗口滑动时,将队头存储的最大元素加入结果List即可。

每次遍历的节点都是新窗口最右边的节点。

import java.util.ArrayList;
import java.util.ArrayDeque;

public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer> ans = new ArrayList<>();
        if(num==null||num.length<size|size<1) return ans;
        
        ArrayDeque<Integer> maxQ = new ArrayDeque<>();
        for(int i=0;i<size;i++){
            while(!maxQ.isEmpty()&&num[i]>num[maxQ.getLast()]) maxQ.removeLast();
            maxQ.addLast(i);
        }
        ans.add(num[maxQ.getFirst()]);
        for(int i=size;i<num.length;i++){
            while(!maxQ.isEmpty()&&num[i]>num[maxQ.getLast()]) maxQ.removeLast();
            maxQ.addLast(i);
            if(maxQ.getFirst()<=i-size) maxQ.removeFirst();
            ans.add(num[maxQ.getFirst()]);
        }
        return ans;
    }
}

运行时间:28ms

占用内存:9248k

posted @ 2019-03-04 20:55  大胖子球花  阅读(93)  评论(0)    收藏  举报