侧滑窗口最大值函数

题目:给你一个数组和一个窗口大小k,要求窗口从数组开始滑动,求解各个窗口的最大值

[leetcode239]https://leetcode.com/problems/sliding-window-maximum/

算法步骤

  1. 使用一个双端队列,遍历数组,如果遇到的数比大于等于队列末尾的数,那么就弹出队列中的数,知道队列末尾大于当前数或者队列为空,然后把当前数加到队列中去。
  2. 检查队列开始的数是否有效,如果无效则应该弹出队列开头的数。
  3. 从i大于等于窗口时,队列首部就是以当前数为最右侧的窗口的最大值。

算法原理

由上述可知,队列头始终存储最大的数,但是小一些的那些书也不能丢弃,是因为如果队列头无效了,那么小一些的数就派上用场了。
等于时也有弹出是因为前边的数一定比后边的数先无效。

代码:

public class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums==null||k<1||nums.length<k)
            return new int[0];
        int len=nums.length;
        int[] res=new int[len-k+1];
        LinkedList<Integer> queue=new LinkedList<Integer>();
        int index=0;
        for(int i=0;i<len;i++){
            int cur=nums[i];
            while(!queue.isEmpty()&&nums[queue.peekLast()]<=cur){
                queue.pollLast();
            }
            queue.addLast(i);
            if(i-k==queue.peekFirst())
                queue.pollFirst();
            if(i>=k-1){
                res[index++]=nums[queue.peekFirst()];
            }
        }
        return res;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,748评论 0 89
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 2,014评论 0 7
  • 现在的人们都只谈理想和目标,很少关注身边走过的是谁,也很少察觉走过那些路,来不及回头和总结! 最近总会在...
    乡下读书人阅读 267评论 0 0
  • L先生,你好呢 夜深人静我总是止不住思念 周五回家,出火车站的时候 忽然发现 围了五年的围挡拆了 火车站终于被修好...
    李碧螺阅读 234评论 0 0