leetcode面试准备:Sliding Window Maximum
leetcode面试准备:Sliding Window Maximum
1 题目
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.
Hint:
- How about using a data structure such as deque (double-ended queue)?
- The queue size need not be the same as the window’s size.
- Remove redundant elements and the queue should store only elements that need to be considered.
接口:public int[] maxSlidingWindow(int[] nums, int k)
2 思路
Brute force solution is O(nw)
Use heap, when window moves, delete the first one in the window, add the next one into the window. The run time complexity is O(n lg w).
Use double-ended queue.
The obvious solution with run time complexity of O(nw) is definitely not efficient enough. Every time the window is moved, we have to search for the maximum from w elements in the window.
We need a data structure where we can store the candidates for maximum value in the window and discard the element, which are outside the boundary of window. For this, we need a data structure in which we can edit at both the ends, front and back. Deque is a perfect candidate for this problem.
We are trying to find a way in which, we need not search for maximum element among all in the window. We will make sure that the largest element in the window would always appear in the front of the queue.
While traversing the array in forward direction if we find a window where element A[i] > A[j] and i > j, we can surely say that A[j], will not be the maximum element for this and succeeding windows. So there is no need of storing j in the queue and we can discard A[j] forever.
For example, if the current queue has the elements: [4 13 9], and a new element in the window has the element 15. Now, we can empty the queue without considering elements 4, 13, and 9, and insert only element 15 into the queue.
3 代码
// 暴力解法:采用左右边界滑动窗口
// Time:O(n*k)
public int[] maxSlidingWindow1(int[] nums, int k) {
int len = nums.length;
if (len == 0)
return new int[0];
int left = 0, right = k - 1;
int[] res = new int[len - k + 1];
while (right < len) {
res[left] = nums[left];
for (int i = left + 1; i <= right; i++) {
res[left] = Math.max(res[left], nums[i]);
}
left++;
right++;
}
return res;
}
// 用TreeSet实现堆,减少查询最大值的效率,降低了复杂度。
// Wrong Answer:无法解决重复元素的问题。
// Time:O(nlogK) Space:O(k)
public int[] maxSlidingWindow2(int[] nums, int k) {
int len = nums.length;
if (len == 0)
return new int[0];
int[] res = new int[len - k + 1];
TreeSet<Integer> heap = new TreeSet<Integer>();
for (int i = 0; i < k - 1; i++) {
heap.add(nums[i]);
}
for (int i = k - 1; i < len; i++) {
heap.add(nums[i]);
int index = i - k + 1;
res[index] = heap.last();
heap.remove(nums[index]);
}
return res;
}
// 用双端队列来解决,时间复杂度降到了O(n)
// Time:O(n) Space:O(k)
public int[] maxSlidingWindow(int[] nums, int k) {
int len = nums.length;
if (len == 0)
return new int[0];
int[] res = new int[len - k + 1];
Deque<Integer> dq = new LinkedList<Integer>();
for (int i = 0; i < len; i++) {
int data = nums[i];
while (!dq.isEmpty() && dq.getLast() < data) {
dq.removeLast();
}
dq.add(data);
if (i < k - 1) {
continue;
}
int index = i - k + 1;
res[index] = dq.getFirst();
if (res[index] == nums[index]) {
dq.removeFirst();
}
}
return res;
}
4 总结
三种方法解决,如何解决堆储存重复元素的问题。
leetcode面试准备:Sliding Window Maximum的更多相关文章
- 【LeetCode】239. Sliding Window Maximum
Sliding Window Maximum Given an array nums, there is a sliding window of size k which is moving fr ...
- 【刷题-LeetCode】239. Sliding Window Maximum
Sliding Window Maximum Given an array nums, there is a sliding window of size k which is moving from ...
- 【LeetCode】239. Sliding Window Maximum 解题报告(Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调递减队列 MultiSet 日期 题目地址:ht ...
- 【LeetCode 239】Sliding Window Maximum
Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...
- [LeetCode] Sliding Window Maximum 滑动窗口最大值
Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...
- Leetcode: sliding window maximum
August 7, 2015 周日玩这个算法, 看到Javascript Array模拟Deque, 非常喜欢, 想用C#数组也模拟; 看有什么新的经历. 试了四五种方法, 花时间研究C# Sorte ...
- [LeetCode] 239. Sliding Window Maximum 滑动窗口最大值
Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...
- LeetCode题解-----Sliding Window Maximum
题目描述: Given an array nums, there is a sliding window of size k which is moving from the very left of ...
- [leetcode]239. Sliding Window Maximum滑动窗口最大值
Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...
随机推荐
- sql server中分布式查询随笔
由于业务逻辑的多样性 经常得在sql server中查询不同数据库中数据 这就产生了分布式查询的需求 现我将开发中遇到的几种查询总结如下: 1.access版本 --建立连接服务器 exec sp_a ...
- LaTeX中用BibTex管理参考文献
BibTeX 是一种用来规范参考文献列表的一种文献管理软件,定义了一种比较通用的管理文献的格式, 用于协调LaTeX的参考文献处理. BibTeX 使用数据库的的方式来管理参考文献. BibTeX 文 ...
- (一)问候Spring4
第一节:Spring 简介 Spring 作者:Rod Johnson: 官方网站:http://spring.io/ 最新开发包及文档下载地址:http://repo.springsource.or ...
- svn---命令行操作
一.基本操作 1.checkout是将服务器上的代码下载到本地(下载所有文件).Checkout只需要做一次 2.commit是将本地修改之后的文件提交到服务器(只提交修改之后的).每天下班前:com ...
- C++ 代码性能优化 -- 循环分割提高并行性
对于一个可结合和可交换的合并操作来说,比如整数的加法或乘法, 我们可以通过将一组合并操作分割成 2 个或更多的部分,并在最后合并结果来提高性能. 原理: 普通代码只能利用 CPU 的一个寄存器,分割后 ...
- Poj 1001 / OpenJudge 2951 Exponentiation
1.链接地址: http://poj.org/problem?id=1001 http://bailian.openjudge.cn/practice/2951 2.题目: Exponentiatio ...
- redis 入门笔记(一)
redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的web应用程序的完美解决方案 三个主要特点: 1,Redis数据库完全在内存中,使用磁盘仅用于持久性 ...
- Eat that Frog
Eat that Frog,中文翻译过来就是“吃掉那只青蛙”.不过这里并不是讨论怎么去吃青蛙,而是一种高效的方法. Eat that Frog是Brian Tracy写的一本书(推荐阅读).这是一个很 ...
- 【转】SQL2008清除日志
USE [master] GO ALTER DATABASE DNName SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE DNName SET ...
- live 写博
1 2 3 4 5 1 2 3 4 5 ...