HOT76-数据流的中位数

        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 以内的答案将被接受。

示例 1:

输入
["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"]
[[], [1], [2], [], [3], []]
输出
[null, null, null, 1.5, null, 2.0]解释
MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1);    // arr = [1]
medianFinder.addNum(2);    // arr = [1, 2]
medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2)
medianFinder.addNum(3);    // arr[1, 2, 3]
medianFinder.findMedian(); // return 2.0

提示:

  • -105 <= num <= 105
  • 在调用 findMedian 之前,数据结构中至少有一个元素
  • 最多 5 * 104 次调用 addNum 和 findMedian

解题方法:大顶堆+小顶堆。将数据流中的各个数字均匀分摊在两个堆中,一个大顶堆,另外一个是小顶堆堆。大顶堆用于保存一半较小的数字,小顶堆用于保存一半较大的数字,且满足大顶堆中的所有数字均小于小顶堆中的所有数字。为了维持这个特性,不管是最终向大顶堆,还是最终向小顶堆push元素,都需要同时向两个堆完成操作。

最终向大顶堆push元素:必经过程为num->小顶堆->大顶堆。即先将num压入小顶堆中,然后将小顶堆中的top元素弹出到大顶堆中。

最终向小顶堆push元素:必经过程为num->大顶堆->小顶堆。即先将num压入大顶堆中,然后将大堆顶的top元素弹出到小顶堆中。

为了求解中位数,我们可以始终维持小顶堆的元素个数大于或等于大顶堆的元素个数,且最多只能多一个(这里也可以始终维持大顶堆的元素个数小于或等于小顶堆的元素个数)。

push操作:先判断两个堆的元素个数是否相同。如果两个堆元素个数相同,则最终向小顶堆push(借助大顶堆过渡),若两个堆元素个数不同,则说明当前小顶堆的个数比大顶堆的个数多1,我们需要最终向大顶堆中push。

求解中位数: 如果两个堆元素个数相同,则取两个堆堆顶元素的平均值;如果两个堆元素个数不同,则取小顶堆的堆顶元素的值。

C++代码

#include <iostream>
#include <queue>
#include <functional> //std::less, std::greater
class MedianFinder {
private:std::priority_queue<int, std::vector<int>, std::less<int>>  m_max_heap;//大顶堆,保存较小的若干元素std::priority_queue<int, std::vector<int>, std::greater<int>> m_min_heap;//小顶堆,保存较大的若干元素
public:MedianFinder() {}void addNum(int num) {// 约定一个规则:如果当前总元素为耦数,最终向m_min_heap中添加元素(路径: num-> m_max_heap -> m_min_heap)//                  这样,添加后总元素个数为奇数,则m_min_heap的堆首元素为中位数//            如果当前总元素为奇数,最终向m_max_heap中添加元素(路径: num->m_min_heap->m_max_heap)// 始终保持: 小顶堆的个数 >= 大顶堆的个数 (最多多1个数字)if (m_max_heap.size() == m_min_heap.size()) { // num->m_max_heap->m_min_heapm_max_heap.emplace(num);m_min_heap.emplace(m_max_heap.top());m_max_heap.pop();} else { //当前总元素个数为奇数,则最终向大顶堆添加元素。num->m_min_heap->m_max_heapm_min_heap.emplace(num);m_max_heap.emplace(m_min_heap.top());m_min_heap.pop();}}double findMedian() {if (m_max_heap.size() != m_min_heap.size()) { // 总元素个数为奇数,则中位数保存在小顶堆中return m_min_heap.top();} else { // 总元素个数为耦数return 0.5 * (m_min_heap.top() + m_max_heap.top());}}
};/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder* obj = new MedianFinder();* obj->addNum(num);* double param_2 = obj->findMedian();*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/25205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s(健康检查+滚动更新+优雅停机+弹性伸缩+Prometheus监控+配置分离)

前言 快速配置请直接跳转至汇总配置 K8s SpringBoot实现零宕机发布&#xff1a;健康检查滚动更新优雅停机弹性伸缩Prometheus监控配置分离&#xff08;镜像复用&#xff09; 配置 健康检查 健康检查类型&#xff1a;就绪探针&#xff08;readiness&#xff09; 存活探针&am…

D3JS教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 D3是Data-Driven Documents的缩写&#xff0c;D3.js是一个基于数据管理文档的资源JavaScript库。 D3 是最有效的数据可视化框架之一。它允许开发人员在 HTML、CSS 和 SVG 的帮助下在浏览器中创建动态的交互式数据可视化。数据可视化是将过滤后的数据以图片和图形的形…

Ubuntu下nvidia-smi失败,使用dkms解决

Ubuntu下nvidia-smi失败&#xff0c;使用dkms解决 错误信息 nvidia-smi显示无法与驱动通讯 NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.原因 一般来说是因为机器重…

useEffect中的函数会执行2次原因

一、useEffect介绍 useEffect是React18的新特性&#xff0c;表示React的生命周期Hooks组件。等价于Claas组件的componentDidMount、componentDidUpdate&#xff0c;useEffect的返回函数等价于componentWillUnmount。&#xff08;组件卸载、重新挂载都会触发这个函数&#xff0c…

【计算机网络】socket编程

文章目录 1. 网络通信的理解2.进程PID可以取代端口号吗&#xff1f;3. 认识TCP协议4. 认识 UDP协议5. socket编程接口udp_server.hpp的代码解析socket——创建 socket 文件描述符Initserver——初始化1.创建套接字接口&#xff0c;打开网络文件bind——绑定的使用 2.给服务器指…

[webpack] 基本配置 (一)

文章目录 1.基本介绍2.功能介绍3.简单使用3.1 文件目录和内容3.2 下载依赖3.3 启动webpack 4.基本配置4.1 五大核心概念4.2 基本使用 1.基本介绍 Webpack 是一个静态资源打包工具。它会以一个或多个文件作为打包的入口, 将我们整个项目所有文件编译组合成一个或多个文件输出出去…

webpack基础知识八:说说如何借助webpack来优化前端性能?

一、背景 随着前端的项目逐渐扩大&#xff0c;必然会带来的一个问题就是性能 尤其在大型复杂的项目中&#xff0c;前端业务可能因为一个小小的数据依赖&#xff0c;导致整个页面卡顿甚至奔溃 一般项目在完成后&#xff0c;会通过webpack进行打包&#xff0c;利用webpack对前…

了解Stream流

文章目录 java Stream流单列集合双列集合数组可变参数 filter什么是filter从代码中理解filter截取元素 limt()跳过指定参数个数的数据 skip()拼接 concat(流1&#xff0c;流2)去重 distinct排序 sorted升序降序 统计数据元素 count() 收集Stream流的数据ListSetMap java Stream…

医疗器械研发中的可用性工程实践(一)

致读者&#xff1a;以前看《楚门的世界》&#xff0c;《蝴蝶效应》&#xff0c;《肖申克的救赎》&#xff0c;《教父》&#xff0c;《横道世之介》&#xff0c;《老友记》&#xff0c;一个人的一生匆匆。作为平凡人就是历史大河中的浪花&#xff0c;顺势而为&#xff0c;起起伏…

spring boot 配置文件和属性注入

文章目录 配置文件位置和路径自定义配置文件 属性注入添加yaml文件的支持 配置文件 位置和路径 当我们创建一个 Spring Boot 工程时&#xff0c;默认 resources 目录下就有一个 application.properties 文件&#xff0c;可以在 application.properties 文件中进行项目配置&am…

wsl安装ziran2019

首先从windows商店搜索ubuntu18 &#xff08;亲测Ubuntu20不行&#xff09; 然后第一次打开会自动安装。 &#xff08;我是用的wsl一代&#xff0c;二代没测试过&#xff09; 新安装的系统首先要更新apt sudo apt update然后设置git git config --global https.proxy http:…

算法与数据结构(二十一)二叉树(纲领篇)

备注&#xff1a;本文旨在通过 labuladong 的二叉树&#xff08;纲领篇&#xff09;理解框架思维&#xff0c;用于个人笔记及交流学习&#xff0c;版权归原作者 labuladong 所有&#xff1b; 我刷了这么多年题&#xff0c;浓缩出二叉树算法的一个总纲放在这里&#xff0c;也许…

C++ 智能指针shared_ptr

文章目录 C智能指针shared_ptr概述shared_ptr使用方法shared_ptr引用计数的增加与减少shared_ptr常用操作 C智能指针shared_ptr概述 在介绍智能指针前先看如下代码 void func1(std::string& str) {std::string* ps new std::string(str);str *ps;return; }void func2(s…

ELK企业级日志分析系统

目录 一、ELK 概述 1.ElasticSearch 2.Kiabana 3.Logstash 可以添加的其它组件 1.Filebeat 2.Fluentd 三、为什么要使用 ELK 四、ELK 的工作原理 五、 ELK Elasticsearch 集群部署 更改主机名、配置域名解析、查看Java环境 部署 Elasticsearch 软件 修改elasticsearc…

自然语言处理从入门到应用——LangChain:提示(Prompts)-[示例选择器(Example Selectors)]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 如果我们拥有大量的示例&#xff0c;我们可能需要选择在提示中包含哪些示例。ExampleSelector是负责执行此操作的类。 其基本接口定义如下所示&#xff1a; class BaseExampleSelector(ABC):"""Interf…

爬虫获取电影数据----以沈腾参演电影为例

数据可视化&分析实战 1.1 沈腾参演电影数据获取 文章目录 数据可视化&分析实战前言1. 网页分析2. 构建数据获取函数2.1 网页数据获取函数2.2 网页照片获取函数 3. 获取参演影视作品基本数据4. 电影详细数据获取4.1 导演、演员、描述、类型、投票人数、评分信息、电影海…

Wisej.NET Crack,Wisej.NET的核心功能

Wisej.NET Crack&#xff0c;Wisej.NET的核心功能 Wisej.NET是一个跨平台的web框架&#xff0c;用于使用.NET和C#/VB.NET而不是HTML和JavaScript构建现代HTML5应用程序。它包含创建任务关键型web应用程序所需的一切&#xff0c;包括UI组件、会话处理、状态管理和后端集成。借助…

单元测试之 - Spring框架提供的单元/集成测试注解

Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注&#xff1a;这里的集成测试指容器内部的集成测试&#xff0c;非系统间的集成测试)&#xff0c;先看看Spring框架提供了哪些注解以及对应的作用。RunWith(SpringRunner.class) / ExtendWith(SpringExtension.class)&…

设计模式行为型——备忘录模式

目录 什么是备忘录模式 备忘录模式的实现 备忘录模式角色 备忘录模式类图 备忘录模式举例 备忘录模式代码实现 备忘录模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;又叫做快照模式&#x…

高并发负载均衡---LVS

目录 前言 一&#xff1a;负载均衡概述 二&#xff1a;为啥负载均衡服务器这么快呢&#xff1f; ​编辑 2.1 七层应用程序慢的原因 2.2 四层负载均衡器LVS快的原因 三&#xff1a;LVS负载均衡器的三种模式 3.1 NAT模式 3.1.1 什么是NAT模式 3.1.2 NAT模式实现LVS的缺点…