首页 > 其他分享 >480. 滑动窗口中位数

480. 滑动窗口中位数

时间:2022-08-22 22:55:24浏览次数:72  
标签:窗口 idx nums mid 中位数 vector 滑动 480

 

难度困难

中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。

例如:

  • [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]

 

class Solution {
public:
    vector<double> medianSlidingWindow(vector<int>& nums, int k) {
        vector<double> res;
        for(int i = 0; i <= nums.size()-k;i++) {
            
            vector<long> temp(nums.begin()+i,nums.begin()+i+k); //开区间
            sort(temp.begin(),temp.end());
            double a = k%2!=0?temp[k/2]: double(temp[k/2]+temp[k/2-1])/2.0;
            res.emplace_back(a);
        }
        return res;
    }
};

 

 

class Solution {
public:
  vector<double> medianSlidingWindow(vector<int>& nums, int k) {
        vector<double> ret;
        multiset<int> window(nums.begin(), nums.begin() + k); // 初始化set,将前k个数存入set
        auto mid = std::next(window.begin(), k / 2); // 基数:获取中数的位置,偶数:获取中数计数参数的后一个数的位置
        for (int idx = k;idx < nums.size() ; idx++) {
            // 1、计数每组窗口中数组的中数,并存入ret中
            auto midValue = ((double)(*mid) + (double)*next(mid, k % 2 - 1)) / 2;
            ret.push_back(midValue);
            
            // 遍历完了,退出
            if (idx == nums.size()) {
                break;
            }
            // 窗口后移
            window.insert(nums[idx]);
            if (nums[idx] < *mid)
                mid--;                  // same as mid = prev(mid)

            // Remove outgoing element
            if (nums[idx - k] <= *mid)
                mid++;                  // same as mid = next(mid)

            // 删除一个元素
            window.erase(window.lower_bound(nums[idx-k]));
        }

        return ret;
    }
};

 

 

 

标签:窗口,idx,nums,mid,中位数,vector,滑动,480
From: https://www.cnblogs.com/zle1992/p/16614542.html

相关文章

  • 【队列】力扣239:滑动窗口最大值
    给定一个整数数组和一个滑动窗口大小,求在这个窗口的滑动过程中,每个时刻其包含的最大值。示例:输入:nums=[1,3,-1,-3,5,3,6,7],k=3输出:[3,3,5,5,6,7]解释:滑动窗口......
  • 2022-8-20 剑指offer-滑动窗口+(桶排序或者有序集合)
    剑指OfferII057.值和下标之差都在给定的范围内难度中等55收藏分享切换为英文接收动态反馈给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在......
  • react滑动分页表格封装
    ScrollTable基本介绍滑动底部进行分页(用Observer实现),支持render支持参数:columns:列属性【Array】,每列支持的属性如下:{hide:false,//是否隐藏该列field:'......
  • 239.sliding-window-maxium 滑动窗口最大值
    采用双端队列deque,并且保证deque从前往后依次递减,并且出现在deque里面的相邻两数,其在原滑动窗口中,两数中间的数一定比这两个数小。为了保证这一点,在push_back()时,如果deque......
  • 《Android》记录RecyclerView滑动位置
    //自行替换自己的recyclerViewvalrecyclerView=RecyclerView(this)vallinearLayoutManager=LinearLayoutManager(this)recycle......
  • leetcode4-寻找两个正序数组的中位数
    寻找两个正序数组的中位数二分查找classSolution{intlen1,len2;publicdoublefindMedianSortedArrays(int[]nums1,int[]nums2){len1=nu......
  • Sentinel源码分析-滑动窗口统计原理
    滑动窗口技术是Sentinel比较关键的核心技术,主要用于数据统计通过分析StatisticSlot来慢慢引出这个概念@Overridepublicvoidentry(Contextcontext,ResourceWrap......
  • 4.寻找两个有序数组的中位数
    首先这个题目最容易想到的解决方法是把两个数组合并之后选出中位数,但是这样的时间复杂度为\(O(m+n)\)与题目的要求不符合,根据题目中的要求\(O(log(m+n))\)可以想到可能要采......