Hard-题目15:239. Sliding Window Maximum

原创 2016年05月31日 23:31:24

题目原文:
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].
题目大意:
给出一个数组和一个k长度的滑动窗口,把滑动窗口从数组开头滑到结尾,求每个滑动窗口内子数组的最大值,组成一个新数组并返回。
题目分析:
朴素解法是暴力枚举每个滑动窗口的最大值,时间复杂度是O(nk),虽然也能ac,但一个hard难度的题不可能只要求到这步。
根据hint,考虑用双端队列,维持队列长度小于等于k,且队头永远为滑动窗口最大值,队列后面跟的是可能成为最大值的候选解。每次加入一个元素,先看队头元素的下标是否已经在滑动窗口之外,如果在则出队,接下来判断这个元素是否大于队尾的值,如果大于则从队尾一直弹出(因为有了这个更大的数,前面的数在往右滑的过程中不可能是解),每次记录下队头的值,即为当前滑动窗口的最大值。
那么还有一个问题,如何知道队头是否滑到了窗口外面呢?答案是,我们的deque只要存的是下标就可以了。因为队列的操作全都是常数时间的,这样的时间复杂度就降到了O(n).
源码:(language:java)

public class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums.length==0)
            return new int[0];
        int[] window = new int[nums.length-k+1];
        int j=0;
        Deque<Integer> deque = new LinkedList<>();
        for(int i = 0;i<nums.length;i++) {
            while (!deque.isEmpty() && nums[deque.getLast()] < nums[i]) {
                deque.removeLast();
            }
            deque.addLast(i);
            if(deque.getFirst() == i-k)
                deque.removeFirst();
            if(i>=k-1)
                window[j++] = nums[deque.getFirst()];
        }
        return window;
    }
}

成绩:
29ms,beats 62.07%,众数31ms,9.54%
Cmershen的碎碎念:
这道题在Leetcode里面算是难题了,且对面试来说算是比较困难的一题,Leetcode的国内山寨版Lintcode的难度评分中将其评为Very Hard难度(lintcode里面very hard难度只有两题,另一题是涉及到线段树的skyline problem),足见此题对普通面试者的难度。
此外discuss中还有一个仅4ms的解法,有机会研读一下。

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

目标检测(Object Detection)原理与实现(六)

基于形变部件模型(Deformable Part Models)的目标检测        上节说了基于cascade的目标检测,cascade的级联思想可以快速抛弃没有目标的平滑窗(slidin...
  • cuoqu
  • cuoqu
  • 2013年07月04日 16:14
  • 14550

单调队列——Poj Sliding Window

给定含有n个元素的无序序列a[],和一个整数k,要求求出a[]中,从左向右每连续k个元素组成的序列中的最小值(或最大值),这样的值可能有1个或n-k+1个。...
  • code_pang
  • code_pang
  • 2013年11月03日 13:54
  • 3096

Leetcode 480. Sliding Window Median 滑动窗口中的中位数 解题报告

1 解题思想题目会给一个数组,和一个滑动窗口的大小K,让你找出当这个窗口滑动的过程中,这个K的窗口内的中位数分别是多少?最naive的方式就是在k个窗口内排序就好,这里不解释(因为开销很大啊,(n-k...
  • MebiuW
  • MebiuW
  • 2017年01月13日 15:11
  • 2661

[Leetcode 239, Hard] Sliding Window Maximum

[Leetcode 239, Hard] Sliding Window Maximum
  • u012212811
  • u012212811
  • 2015年07月23日 20:35
  • 314

LeetCode-239.Sliding Window Maximum

https://leetcode.com/problems/sliding-window-maximum/ Given an array nums, there is a sliding wind...
  • zmq570235977
  • zmq570235977
  • 2016年06月02日 21:48
  • 448

[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...
  • TstsUgeg
  • TstsUgeg
  • 2016年05月16日 21:35
  • 255

leetcode No239. Sliding Window Maximum

Question: Given an array nums, there is a sliding window of size k which is moving from the very ...
  • u011391629
  • u011391629
  • 2016年11月12日 10:44
  • 316

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...
  • u010005161
  • u010005161
  • 2016年09月01日 17:47
  • 233

Leetcode 239 Sliding Window Maximum

1. 问题描述  给定一个整数数组和一个大小为k的滑动窗口,滑动窗口每次从左到右移动一个数字,返回每次滑动窗口中的最大值。   2. 方法与思路  Method 1:最朴素的解法就是将窗口在数组上进...
  • Jeanphorn
  • Jeanphorn
  • 2015年07月19日 13:26
  • 2474

LeetCode 239: Sliding Window Maximum

239. Sliding Window MaximumDifficulty: Hard Given an array nums, there is a sliding window of size ...
  • Cycle1413
  • Cycle1413
  • 2016年07月06日 15:09
  • 149
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hard-题目15:239. Sliding Window Maximum
举报原因:
原因补充:

(最多只允许输入30个字)