目录
480. 滑动窗口中位数
题目链接:https://leetcode-cn.com/problems/sliding-window-median/
难度困难239
中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。
例如:
[2,3,4]
,中位数是3
[2,3]
,中位数是(2 + 3) / 2 = 2.5
给你一个数组 nums,有一个长度为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。
示例:
给出 nums = [1,3,-1,-3,5,3,6,7]
,以及 k = 3。
窗口位置 中位数
--------------- -----
[1 3 -1] -3 5 3 6 7 1
1 [3 -1 -3] 5 3 6 7 -1
1 3 [-1 -3 5] 3 6 7 -1
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] 6
因此,返回该滑动窗口的中位数数组 [1,-1,-1,3,5,6]
。
提示:
- 你可以假设
k
始终有效,即:k
始终小于输入的非空数组的元素个数。 - 与真实值误差在
10 ^ -5
以内的答案将被视作正确答案。
方法一 利用multiset
思路
这道题我的思路是平常的思路,就是会超时的思路,然后看别人的题解,非常有启发的一点是,在做题的过程中一定要记住要维护什么,比如这个题就要维护一个有序的k个数,然后窗口滑动要插入、删除相应的数,然后呢如果每次滑动窗口都排序的话时间复杂度是O(klogk),然后大概的总时间复杂度应该是O(N(klogk)) ?
为了减少时间复杂度,利用已经实现的数据结构 ,看别人的题解:
中位数 是有序序列最中间的那个数。也就是说我们必须对窗口内的元素「排序」。我们知道排序的时间复杂度一般是 O(k * log(k)) ,还是比较高的。这个题如果对每个区间都进行分别排序肯定会超时,否则也不会是个 Hard 题目。
怎么快速求中位数呢&#x