滑动窗口中位数
中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。
例如:
- [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,-1,-1,3,5,6]。
解题思路
因为该题中提到了滑动窗口,所以需要用双指针:left 指针和 right 指针,开始时均指向数组开头。
(1) 判断当前窗口大小 right - left + 1 = k 是否成立,若成立则将窗口中的元素进行排序,并将这些排好序的元素单独拿出来放到 window 数组中。
(2) 找到 window 数组中的中位数,此时需要判断 窗口大小(值为 k )是奇数还是偶数:
- 若 k 为偶数:找窗口中间位置的两个元素求得中位数即可,此时中位数 = window[len / 2] / 2.0 + window[len / 2 - 1] / 2.0, 其中 len 为窗口的大小(len == k)。
- 若k为奇数:找窗口中间位置的元素就是中位数,此时中位数 = window[len / 2], 其中len为窗口的大小(len == k)。
(3) 将找到的当前窗口的中位数存到指定的数组当中,并且 left 指针向右移动一位,right 指针也向右移动一位(整个窗口的大小不变的向右移动一位),直到遍历完整个 nums 数组为止。
其中存放中位数的数组的大小为 n - k + 1 (n 为 nums 数组的长度,k 为滑动窗口中的元素个数)
友情提示:在使用双指针时,若用 while 循环会运行超时,此时应该使用 for 循环来实现双指针的操作!!
代码
class Solution {
public double[] medianSlidingWindow(int[] nums, int k