标签:
原题链接在这里:https://leetcode.com/problems/sliding-window-maximum/
[1,3,-1,-3,5,3,6,7]
, and k = 3.
用一个deque, 里面存index. 从尾部添加index前先检查deque的尾部index对应的元素nums[ls.getLast()]是否比要添加的元素nums[i]小或者相等,若是,就把尾部index remove掉,一直remove直到遇到比nums[i]大的数或者LinkedList 为空。e.g. 当添加nums[1] = 3的index 1时,最大的数肯定是3,1就没有用了。也就是说如果出现比先添加的数大的数时,先添加的就没有用了。
如此LinkedList里面保存的就是[第一大index, 第二大index, 第三大index, 第四大index...].
若是尾部的index - 头部的index + 1 大于了k, 就说明现在的window大小已经大于了k, 就需要从头remove一个。
当 i+1>=k 是开始记录res. res的坐标为i-k+1, 取ls的头index, 也就是当前窗口的最大index. 把对应的元素加大res中。
Note: 当k == 0时是特殊情况,此时应返回[]. 需要特殊处理。
Time O(n), Space O(k).
AC Java:
1 public class Solution { 2 public int[] maxSlidingWindow(int[] nums, int k) { 3 if(k == 0){ 4 return new int[0]; //error 5 } 6 7 int [] res = new int[nums.length-k+1]; 8 LinkedList<Integer> ls = new LinkedList<Integer>(); 9 for(int i = 0; i<nums.length; i++){ 10 while(!ls.isEmpty() && nums[ls.getLast()]<=nums[i]){ 11 ls.removeLast(); 12 } 13 ls.addLast(i); 14 if(ls.getLast()-ls.getFirst() + 1 > k){ 15 ls.removeFirst(); 16 } 17 if(i+1>=k){ 18 res[i-k+1] = nums[ls.getFirst()]; 19 } 20 } 21 return res; 22 } 23 }
LeetCode Sliding Window Maximum
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4938106.html