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:

  1. How about using a data structure such as deque (double-ended queue)?
  2. The queue size need not be the same as the window’s size.
  3. Remove redundant elements and the queue should store only elements that need to be considered.

接口:public int[] maxSlidingWindow(int[] nums, int k)

2 思路

  1. Brute force solution is O(nw)

  2. 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).

  3. 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的更多相关文章

  1. 【LeetCode】239. Sliding Window Maximum

    Sliding Window Maximum   Given an array nums, there is a sliding window of size k which is moving fr ...

  2. 【刷题-LeetCode】239. Sliding Window Maximum

    Sliding Window Maximum Given an array nums, there is a sliding window of size k which is moving from ...

  3. 【LeetCode】239. Sliding Window Maximum 解题报告(Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调递减队列 MultiSet 日期 题目地址:ht ...

  4. 【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 ...

  5. [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 ...

  6. Leetcode: sliding window maximum

    August 7, 2015 周日玩这个算法, 看到Javascript Array模拟Deque, 非常喜欢, 想用C#数组也模拟; 看有什么新的经历. 试了四五种方法, 花时间研究C# Sorte ...

  7. [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 ...

  8. LeetCode题解-----Sliding Window Maximum

    题目描述: Given an array nums, there is a sliding window of size k which is moving from the very left of ...

  9. [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 ...

随机推荐

  1. 设计模式------Adapter(适配器)

    地址:http://blog.csdn.net/wuzhekai1985/article/details/6665542,仅供学习用. 适配器:STL实现了一种数据结构,称为双端队列(deque),支 ...

  2. HW—可怕的阶乘n!__注意大数据函数的使用BigInteger

    java.math.BigInteger系列教程(四)BigInteger的诞生原因 为什么java里面要出现BigInteger类型呢?相信很多人有这个疑问,其实原因很简单,它可以表达更大范围的数值 ...

  3. C 中随机数

    C语言,如何产生随机数: 基本函数 在C中取随机数所需要对函数是: int rand ( void ); void srand ( unsigned int n); 备注:必须包含该头文件#inclu ...

  4. 【JAVA】在编译期可直接替换的final变量

    一.满足以下三个条件,一个final变量就不再是一个变量,而是一个直接量. 使用final修饰符修饰. 在申明的时候就进行初始化 初始化的值在编译器就可以确定. 二.在什么情况下初始化的值在编译期是可 ...

  5. invalid code signing entitlement的通用暴力解决办法

    1.添加的一台苹果设备为开发机子后,打版本,说profile 没找到,报错 2.上传二进制文件到itunes connect ,报错 3.有时候还什么 appID 无效,报错 烦死他了 我的解决办法, ...

  6. OC5_NSMutableString操作

    // // main.m // OC5_NSMutableString操作 // // Created by zhangxueming on 15/6/10. // Copyright (c) 201 ...

  7. nodejs连接MySQL数据库

    在github上搜索orm2 https://github.com/dresende/node-orm2: 在项目文件夹使用npm install orm下载下来,然后书写配置文件 var orm = ...

  8. (hdu)2444 The Accomodation of Students 判断二分图+最大匹配数

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Problem Description There are a group of s ...

  9. linux 判断指定用户对指定目录具有的权限

    脚本名:power.sh 脚本内容: ------------------------------------------- 注意:必须以root 身份执行该脚本. 脚本power.sh 需要两个参数 ...

  10. C++中使用多线程

    使用的函数是CreateThread和CloseHandle相互配合. 举个简单的例子: 申明类变量 HANDLE hThread; DWORD ThreadID; 在需要创建线程的地方使用: hTh ...