单调队列

97 阅读1分钟
  • 队列中的元素始终保持有序,解决有这种需要的算法问题(提高时间复杂度)

239. 滑动窗口最大值

  • 为了节省时间复杂度,避免使用暴力遍历,因此考虑使用一种保持有序的队列,同时根据窗口值舍弃元素添加元素
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int len=nums.length;
        if(len<2) return nums;
        int[] ans=new int[len-k+1];
        LinkedList<Integer> queue=new LinkedList<>();
        for(int i=0;i<len;i++){
            //保证有序
            while(!queue.isEmpty() && nums[queue.peekLast()]<nums[i]){
                queue.pollLast();
            }
            queue.offer(i);
            //队头最大元素是否在窗口内,不在的话舍去
            if(queue.peek()<=i-k){
                queue.poll();
            }
            //是否第一个窗口已经遍历完成
            if(i+1>=k){
                ans[i+1-k]=nums[queue.peek()];
            }
        }
        return ans;
    }
}