当前位置: 首页 > news >正文

leetcode 困难 —— 数据流的中位数(优先队列)

题目:
中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。
例如 arr = [2,3,4] 的中位数是 3 。
例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5 。
实现 MedianFinder 类:
MedianFinder() 初始化 MedianFinder 对象。
void addNum(int num) 将数据流中的整数 num 添加到数据结构中。
double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。

题解:
① 双指针 + 有序集合
用一个有序集合存储,然后取其中中间那一个或者中间那两个就行

但有序集合中,不能直接取其中第 n 个大的元素
每一次遍历到第 n 个,又会导致效率过低
所以通过双指针,指向中间那一个或者中间那两个

然后根据插入值的大小和指针指向的值的大小比对,判断不同情况,进行移动指针

(这个有序集合不能是 set,因为 set 会去重,可以用 multiset)

② 优先队列
(最开始不知道 multiset,所以用的这个方法)

既然想不到用什么集合能快速找到第 n 个大小的值
但应该能想到我们可以快速会得到最大值和最小值,优先队列

一个序列我们可以分为
左边 n 个数              中位数              右边 n 个数

左边维护一个优先队列,我们只需要知道最大值
右边维护一个优先队列,我们只需要知道最小值

然后根据不同情况,进行不同的插入优先队列,取出值的操作即可

代码如下:

class MedianFinder {
public:bool flag = true;int left = INT_MAX, right = INT_MAX;priority_queue<int> left_temp;priority_queue<int, vector<int>, greater<int> > right_temp;MedianFinder() {}void addNum(int num) {if(left == INT_MAX) {left = right = num;flag = !flag;return;}if(num >= right) {if(flag) {left_temp.push(left);right_temp.push(num);left = right;}else {right_temp.push(num);right = right_temp.top();right_temp.pop();}}else if(num <= left) {if(flag) {left_temp.push(num);right_temp.push(right);right = left;}else {left_temp.push(num);left = left_temp.top();left_temp.pop();}}else {left_temp.push(left);right_temp.push(right);left = right = num;}flag = !flag;}double findMedian() {return (left + right) / 2.0;}
};/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder* obj = new MedianFinder();* obj->addNum(num);* double param_2 = obj->findMedian();*/
http://www.lryc.cn/news/28178.html

相关文章:

  • 7个常用的原生JS数组方法
  • 一、一篇文章打好高数基础-函数
  • pipenv的基本使用
  • OpenCV入门(三)快速学会OpenCV2图像处理基础
  • 基于PySide6的MySql数据库快照备份与恢复软件
  • BI不是报表,千万不要混淆
  • sizeof以及strlen的用法以及注意事项
  • 数据结构-链表-单链表(3)
  • 【SpringBoot初级篇】JdbcTemplate常用方法
  • React(三):脚手架、组件化、生命周期、父子组件通信、插槽、Context
  • [教程]使用 Git 克隆指定分支
  • Redis实现服务注册与服务发现源码阅读(Go语言)
  • 论文复现-3
  • 667知识点 | 经过三年实战检验的667知识清单
  • 后端快速上手前端三剑客 HtmlCSSJavaScript
  • Cdiscount、Allegro如何利用测评补单自养号提升店铺权重和流量
  • 第16天-性能压测:压力测试,性能监控,优化QPS,Nginx动静分离
  • 【python 基础篇 十一】python的函数-------函数的偏函数 高阶函数 返回函数 匿名函数 闭包
  • 妇女节到了,祝福所有女神 Happy Women‘s Day!
  • etcd集群通过 Leader 写入数据,为什么K8s HA集群中讲每个 kube-apiserver 只和本机的 ETCD 通信
  • HTML 表单
  • HTML、CSS学习笔记5(移动端基础知识、Flex布局)
  • 【Java学习笔记】2.Java 开发环境配置
  • MyBatis——进阶操作(2)
  • 循环结构
  • 漫谈数据库表设计及索引设计
  • 【JavaWeb】CSS基础知识:引入方式 + 选择器
  • 02-前端-javaScript
  • 对链表学习的总结一
  • toSring()还有个高级用法好用