[抄题]:

给定一个包含 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;

[暴力解法]:

时间分析:

空间分析:

[思维问题]:

  1. 不理解两个heap和窗口的大小关系:把窗口容量全扔进来,具体分到哪个格子另当别论
  2. 体会到了treemap相对于heap的优越性:想romove哪个点是随便的。注意接口、实现都不是PQ,是treeset 而且树状的题想想里面装的是node还是数字

[一句话思路]:

窗口移动就是加一个元素、减一个元素,用俩函数实现,所以可以放在maxheap minheap中

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 窗口满了之后romove第一个点,i - k + 1,不是第i个点,写习惯了就错了。重要的参数要提前注释行
  2. 要在maxheap有点的前提下进行节点交换,想到其临界情况:还没有点

[二刷]:

[三刷]:

[四刷]:

[五刷]:

[五分钟肉眼debug的结果]:

[总结]:

参数需要边分析边写,留意leetcode lintcode接口是不是不一样

[复杂度]:Time complexity: O(n个数*左右treeset体积lgk) Space complexity: O(n)

[英文数据结构或算法,为什么不用别的数据结构或算法]:

  1. node中自己的类、自己的compareTo方法都应该有参数,否则无法调用,要理解其作用
  2. 只有implements能实现接口,还是很多个。不要写extends

[关键模板化代码]:

 自制Collections.sort 方法有一个字母 第一位不相等
 自制compareTo 方法有两个字母 第二位相等

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

class Node implements Comparable<Node>{
int id;
int val;
Node (int id, int val){
this.id = id;
this.val = val;
}
public int compareTo(Node other) {
Node a = other;
if (this.val == a.val) {
return this.id - a.id;
}else {
return this.val - a.val;
}
}
} public class Solution {
/*
* @param nums: A list of integers
* @param k: An integer
* @return: The median of the element inside the window at each moving
*/
public double[] medianSlidingWindow(int[] nums, int k) {
//corner case
int n = nums.length;
double[] result = new double[n];
if (nums == null || k == 0) {
return result;
}
TreeSet<Node> minHeap = new TreeSet<>();
TreeSet<Node> maxHeap = new TreeSet<>();
//add all nums into window, rest
int half = (k + 1) / 2;
int index = 0;
for (int i = 0; i < k - 1; i++) {
add(minHeap, maxHeap, half, new Node(i, nums[i]));
}
for (int i = k - 1; i < n; i++) {
add(minHeap, maxHeap, half, new Node(i, nums[i]));
nums[index] = minHeap.last().val;
index++;
remove(minHeap, maxHeap, new Node(i - k + 1, nums[i - k + 1]));
} return result;
} // write reference first!
void add(TreeSet<Node> minHeap, TreeSet<Node> maxHeap, int size, Node node) {
if (minHeap.size() < size) {
minHeap.add(node);
}else {
maxHeap.add(node);
} if (minHeap.size() == size) {
//don't forget just minheap, need to ensure
if (maxHeap.size() > 0 && minHeap.last().val > maxHeap.first().val) {
Node b = minHeap.last();
Node s = maxHeap.first();
minHeap.remove(b);
minHeap.add(s);
maxHeap.remove(s);
maxHeap.add(b);
}
}
} void remove(TreeSet<Node> minHeap, TreeSet<Node> maxHeap, Node node) {
if (minHeap.contains(node)) {
minHeap.remove(node);
}else {
maxHeap.remove(node);
}
}
}

[代码风格] :

  1. 打草稿的时候先把函数参数写了 是分析出来的,不要主函数调用的时候就瞎写
  2. Node 注意开头得大写

滑动窗口的中位数 · Sliding Window Median的更多相关文章

  1. 滑动窗口协议(Sliding Window Protocol)

    滑动窗口协议(Sliding Window Protocol),属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方 ...

  2. 【LeetCode】480. 滑动窗口中位数 Sliding Window Median(C++)

    作者: 负雪明烛 id: fuxuemingzhu 公众号: 每日算法题 本文关键词:LeetCode,力扣,算法,算法题,滑动窗口,中位数,multiset,刷题群 目录 题目描述 题目大意 解题方 ...

  3. 洛谷——P1886 滑动窗口|| POJ——T2823 Sliding Window

    https://www.luogu.org/problem/show?pid=1886#sub || http://poj.org/problem?id=2823 题目描述 现在有一堆数字共N个数字( ...

  4. [LeetCode] Sliding Window Median 滑动窗口中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  5. Lintcode360 Sliding Window Median solution 题解

    [题目描述] Given an array of n integer, and a moving window(size k), move the window at each iteration f ...

  6. Leetcode: Sliding Window Median

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  7. Sliding Window Median LT480

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  8. LeetCode 480. Sliding Window Median

    原题链接在这里:https://leetcode.com/problems/sliding-window-median/?tab=Description 题目: Median is the middl ...

  9. 480 Sliding Window Median 滑动窗口中位数

    详见:https://leetcode.com/problems/sliding-window-median/description/ C++: class Solution { public: ve ...

随机推荐

  1. Memcached工作原理及常见问题

    memcached是怎么工作的? Memcached的神奇来自两阶段哈希(two-stage hash).Memcached就像一个巨大的.存储了很多<key,value>对的哈希表.通过 ...

  2. linux screen 命令详解(转载)

    转载于:http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html 一.背景 系统管理员经常需要SSH 或者telent 远程登录到Li ...

  3. Ubuntu下MySQL数据库文件 物理迁移后 出现的问题

    参考资料: https://www.cnblogs.com/advocate/archive/2013/11/19/3431606.html 本文要解决的一个问题是数据库文件进行物理迁移时遇到的问题. ...

  4. java中读取配置文件

    若是Javaweb项目,项目运行于tomcat或其他容器时,可以使用下面方式来获取文件的输入流 1.当属性文件放在src下面时 InputStream is = Thread.currentThrea ...

  5. Oracle数据库导入导出(备份还原)

    一.数据库的导出 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中(全库导出) exp system/manager@TEST file=d:\ ...

  6. 二:状压dp

    一:状压dp的基本特征 状态压缩问题一般是指用十进制的数来表示二进制下的状态 这种用一个数来表示一组数,以降低表示状态所需的维数的解题手段,就叫做状态压缩. 常用到位运算 二:位运算 &:与运 ...

  7. 【转】Vim自动补全插件----YouCompleteMe安装与配置

    原文网址:http://www.cnblogs.com/zhongcq/p/3630047.html 使用Vim编写程序少不了使用自动补全插件,在Linux下有没有类似VS中的Visual Assis ...

  8. CentOS 6.5 下搭建FastDFS服务

    参考网站: http://www.open-open.com/lib/view/open1435468300700.html http://blog.csdn.net/lynnlovemin/arti ...

  9. redis Linux 、Windows ubuntu 下的安装

    Redis 安装 2018-07-05 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 ...

  10. memcached内存管理机制分析

    memached是高性能分布式内存对象系统,通过在内存中存储数据对象来减少对磁盘的数据读取次数,提高服务速度. 从业务需求出发.我们通过一条命令(如set)将一条键值对(key,value)插入mem ...