当前位置:首页 > 未命名 > 正文内容

【解题报告】【lintcode362】Sliding Window Maximum

u3blog8年前 (2016-05-19)未命名226

题意

给出一组数字,一个滑动窗口的大小,窗口从开始滑动到数字结束,返回每次窗口中的最大值

解答

由于时间复杂度的要求,我们不能暴力求解,因为这样的复杂度是n*n级别,而题目要求n级别 我们可以通过记录数组下标来解答这个题目 每次新的数字进入时,把小于它的数字下标全部移除,形成递减的结果数组,每次取这个数组的第一个就是当前窗口最大的数了 由于每一个数字只会被操作两次,一次是进入,一次是弹出,所以时间复杂度是O(n)的

代码

public class SlidingWindowMaximum {
    public ArrayList<Integer> maxSlidingWindow(int[] nums, int k) {
        if (nums == null || nums.length == 0) return new ArrayList<>();
        LinkedList<Integer> deque = new LinkedList<Integer>();
        int[] res = new int[nums.length + 1 - k];
        for (int i = 0; i < nums.length; i++) {
            if (!deque.isEmpty() && deque.peekFirst() == i - k)
                deque.poll();
            while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i])
                deque.removeLast();
            deque.offerLast(i);
            if ((i + 1) >= k) res[i + 1 - k] = nums[deque.peek()];
        }
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < res.length; i++) {
            list.add(res[i]);
        }
        return list;
    }
}

扫描二维码推送至手机访问。

版权声明:本文由u3blog发布,如需转载请注明出处。

本文链接:https://u3blog.xyz/?id=426

分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。