Leetcode: Sliding Window Maximum
2015-11-19 16:04
423 查看
Question
Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.For example,
Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.
Window position Max
————— —–
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
Therefore, return the max sliding window as [3,3,5,5,6,7].
Note:
You may assume k is always valid, ie: 1 ≤ k ≤ input array’s size for non-empty array.
Follow up:
Could you solve it in linear time?
Show Hint
Hide Company Tags Zenefits
Hide Tags Heap
Hide Similar Problems (H) Minimum Window Substring (E) Min Stack (H) Longest Substring with At Most Two Distinct Characters (H) Paint House II
Have you met this question in a real interview? Yes No
Discuss
Analysis
The naive way is to maintain a sliding window with size k. For each window, we sort it and get the max value. the time complexity is O( n * nlog(n) )It is easy to use heap to get the maximum value. But we need to store both its value and its position. The time complexity is O( n* log(n) ).
The efficient solution takes O( n ).
Actually, if using heap, the most of elems in the bottom of heap are never be used. Think about it. Even if the toppest elem is popped, the second largest elem will be appear. The heap size is always k, some elems in the bottom are discarded.
So we use one queue. Instead of storing all elems in current sliding window, it only stores the potential large elems, decreasing subsequence. It is the same as the function of heap.
The first elem of queue is the largest one for current window. When window slides, we need to pop the first elem and add the new one.
Solution
Get idea from here1, here2time complexity: O(n)
space complexity: O(k)
process
[code]ind:0, queue: [1], ans=[] 1 3 -1 -3 5 3 6 7 ind:1, queue: [3], ans=[] 1 3 -1 -3 5 3 6 7 ind:2, queue: [3,-1], ans=[3] 1 3 -1 -3 5 3 6 7 ind:3, queue: [3,-1,-3], ans=[3,3] 1 3 -1 -3 5 3 6 7 ind:4, queue: [5], ans=[3,3,5] 1 3 -1 -3 5 3 6 7 ind:5, queue: [5,3], ans=[3,3,5,5] 1 3 -1 -3 5 3 6 7 ind:6, queue: [6], ans=[3,3,5,5,6] 1 3 -1 -3 5 3 6 7 ind:7, queue: [7], ans=[3,3,5,5,6,7] 1 3 -1 -3 5 3 6 7
Code
[code]class Solution(object): def maxSlidingWindow(self, nums, k): """ :type nums: List[int] :type k: int :rtype: List[int] """ res, queue = [], [] for ind in range(len(nums)): # make sure the size fo range of all elems in queue is smaller than k if len(queue)>0 and ind-queue[0][0]>=k: del queue[0] # we don't need to consider the small elem, which are never be the largest one in the range while len(queue)>0 and nums[ind] > queue[-1][1]: queue.pop() queue.append( (ind, nums[ind]) ) # for each window, output its result if ind>=k-1: res.append( queue[0][1] ) return res
相关文章推荐
- Java中使用Runtime和Process类运行外部程序
- Android 通过浏览器打开App
- python 调用系统命令,执行命令行
- 十五个常用的jquery代码段
- sql 同一行中,不同结果在不同列显示
- 蓝牙低功耗(Bluetooth Low Energy)
- Eclipse用法和技巧十五:自动添加未实现方法1
- ibatis源码分析—运行流程解析(一)
- javaSE API的下载与javaEE API的在线查看
- 调试打印复杂对象
- 第十二周实践项目3—图遍历算法实现
- fragment stack
- 图的基本操作
- mysql关闭prepareStatement功能
- 使用AsyncTask时出现doInBackground没有调用的处理方法
- ASP.NET MVC Action的参数名与参数类型不同,导致取不到Request数据
- Eclipse用法和技巧十四:自动生成的TODO注释2
- 获得当前登录系统的用户名
- poj 1929 Calories from Fat 模拟水题
- Nginx虚拟主机配置