美文网首页
滑动窗口的中位数

滑动窗口的中位数

作者: 神棄丶Aria | 来源:发表于2018-04-11 16:41 被阅读0次

题目

这是lintcode上的一道题,上次看别人发了后自己试着写了一下。感觉是比较没有技术含量的解题思路吧,而且上次面试时候也有遇到过,就当做个记录。

以下是题目:
·····································
给定一个包含 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;

·····································

代码

import java.util.Comparator;
import java.util.List;

public class Solution {


    public static void main(String[] args){
        System.out.println(medianSlidingWindow(new int[]{1,2,7,7,2},3));
    }

    /**
     * @param nums: A list of integers
     * @param k: An integer
     * @return: The median of the element inside the window at each moving
     */
    public static List<Integer> medianSlidingWindow(int[] nums, int k) {
        // write your code here
        if (nums == null || nums.length == 0 || k <= 0)return new ArrayList<Integer>();
        int left = 0;
        int right = k -1;
        List<Data> temp = new ArrayList<>();
        List<Integer> result = new ArrayList<>();
        for (int i = left;i<right;i++){
            temp.add(new Data(i,nums[i]));
        }
        temp.sort(new MyCom());
        int curLeft = 0;
        for (;right < nums.length;left++,right++){
            Data target = new Data(right,nums[right]);
            boolean insertTarget = false,findPos = false;
            for (int j = 0;j<temp.size();j++){
                Data data = temp.get(j);
                if (data.value >=target.value && !insertTarget){
                    temp.add(j,target);
                    j++;
                    insertTarget = true;
                }
                if (data.pos == left && !findPos){
                    curLeft = j;
                    findPos = true;
                }
                if (insertTarget && findPos)break;
            }
            if (!insertTarget)
                temp.add(target);
            result.add(temp.get((temp.size()-1) / 2).value);
            temp.remove(curLeft);
        }

        return result;
    }

    static class Data{
        public Data(int pos,int value){
            this.pos = pos;
            this.value = value;
        }
        int pos;
        int value;
    }

    static class MyCom implements Comparator<Data> {

        @Override
        public int compare(Data o1, Data o2) {
            if (o1.value > o2.value)return 1;
            if (o1.value == o2.value)return 0;
            return -1;
        }

        @Override
        public boolean equals(Object obj) {
            return false;
        }
    }
}


相关文章

  • 滑动窗口的中位数

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

  • 利口 480 滑动窗口中位数

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

  • 滑动窗口中位数最优解

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

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

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

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

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

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

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

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

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

  • 2019-06-19

    1、机器人的运动范围 2、矩阵中的路径 3、滑动窗口中的最大值 4、数据流中的中位数 5、扑克牌顺子 6、圆圈中删...

  • Flutter-BottomSheet(底部滑动窗口)

    BottomSheet(底部滑动窗口) ModalBottomSheet(对话框式底部滑动窗口) BottomSh...

  • (3)FlinkSQL滑动窗口demo演示

    滑动窗口(Sliding Windows)与滚动窗口类似,滑动窗口的大小也是固定的。区别在于,窗口之间并不是首尾相...

网友评论

      本文标题:滑动窗口的中位数

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