码迷,mamicode.com
首页 > Windows程序 > 详细

LeetCode Sliding Window Maximum

时间:2015-11-05 07:40:26      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

原题链接在这里: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!