侧滑窗口最大值函数

2016-08-22  本文已影响64人  futurehau

题目:给你一个数组和一个窗口大小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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读