美文网首页
滑动窗口中位数最优解

滑动窗口中位数最优解

作者: soSweety | 来源:发表于2017-09-09 22:35 被阅读0次

给定一个包含 n 个整数的数组,和一个大小为 k 的滑动窗口,从左到右在数组中滑动这个窗口,找到数组中每个窗口内的中位数。(如果数组个数是偶数,则在该窗口排序数字后,返回第 N/2 个数字。)

样例

对于数组 [1,2,7,8,5], 滑动大小 k = 3 的窗口时,返回 [2,7,7]

最初,窗口的数组是这样的:

[ | 1,2,7 | ,8,5] , 返回中位数 2;

接着,窗口继续向前滑动一次。

[1, | 2,7,8 | ,5], 返回中位数 7;

接着,窗口继续向前滑动一次。

[1,2, | 7,8,5 | ], 返回中位数 7;

public class Solution {

    public double[] medianSlidingWindow(int[] nums, int k) {

        int n = nums.length;

        int m = n - k + 1; // 结果的尺寸

        double[] res = new double[m];

        //两个堆,一个最大堆,一个最小

        PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(k, Collections.reverseOrder());

        PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(k);

        for ( int i=0; i<n; i++){

            int num = nums[i];

            // 让maxHeap始终保存小于一半的值,minHeap保存大于一半的,正好两半

            if( maxHeap.size() == 0 || maxHeap.peek() >= num)

                maxHeap.add(num);

            else minHeap.add(num);

            // 维护两个堆,保证两个堆得大小,要么保持一致(偶数时),要么maxHeap多一个(奇数时)

            if( minHeap.size() > maxHeap.size() )

                maxHeap.add(minHeap.poll());

            if( maxHeap.size() > minHeap.size() + 1 )

                minHeap.add(maxHeap.poll());

            // 如果需要输出

            if ( i-k+1 >=0 ){

                if( k % 2 == 1 )

                    res[i- k + 1] = maxHeap.peek();

                else

                    res[i- k + 1] = (maxHeap.peek()/2.0 + minHeap.peek()/2.0); // 小心溢出

                //移除并更新

                int toBeRemove = nums[i - k + 1];

                if( toBeRemove <= maxHeap.peek())

                    maxHeap.remove(toBeRemove);

                else minHeap.remove(toBeRemove);

                // 维护两个堆,保证两个堆得大小,要么保持一致(偶数时),要么maxHeap多一个(奇数时)

                if( minHeap.size() > maxHeap.size() )

                    maxHeap.add(minHeap.poll());

                if( maxHeap.size() > minHeap.size() + 1 )

                    minHeap.add(maxHeap.poll());

            }

        }

        return res;

    }

}

相关文章

  • 滑动窗口中位数最优解

    给定一个包含 n 个整数的数组,和一个大小为 k 的滑动窗口,从左到右在数组中滑动这个窗口,找到数组中每个窗口内的...

  • 76 最小覆盖子串

    解法 下面解法不是最优解,后续再优化 优化后的方法,滑动窗口进行滑动,会移动左指针,过滤掉多余的左指针。

  • 滑动窗口的中位数

    题目 这是lintcode上的一道题,上次看别人发了后自己试着写了一下。感觉是比较没有技术含量的解题思路吧,而且上...

  • 利口 480 滑动窗口中位数

    题意:给定一个数组和一个滑动窗口,返回每一个滑动窗口的中位数 思路:遍历数组 维护一个最小的treeset,和一个...

  • Algorithm进阶计划 -- 滑动窗口

    滑动窗口算法滑动窗口框架滑动窗口运用 1. 滑动窗口框架 滑动窗口算法,核心思路是维护一个窗口,不断滑动,然后更新...

  • 解明动态滑动窗口

    滑动窗口是面试中经常出现的题型,通过上次的分析大家应该都了解了它的出题规律跟解题思想,一般要我们在一个数组或者链表...

  • TCP可靠传输理论;流量控制;拥塞控制

    滑动窗口、超时重传、选择确认SACK 滑动窗口 滑动窗口:发送窗口、接收窗口。发送窗口内的数据都可以发送,在收到新...

  • 【LeetCode】480. 滑动窗口中位数(滑动窗口、二分查找

    简书内代码已上传GitHub:点击我 去GitHub查看代码这题什么鬼啊... 昨天那2小时是我膨胀了...今天又...

  • 3. 无重复字符的最长子串

    主要用到了滑动窗口算法两个指针之间就代表是一个滑动窗口,滑动窗口必须保证没有重复元素,同时保留最大的滑动窗口的大小...

  • 剑指offer最优解Java版-滑动窗口的最大值

    剑指offer专题地址 剑指offer索引地址 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最...

网友评论

      本文标题:滑动窗口中位数最优解

      本文链接:https://www.haomeiwen.com/subject/lggajxtx.html