JAVA学习-练习试用Java实现“数据流的中位数”

news/2024/9/18 20:57:08/ 标签: 学习, java

问题:


中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

解答思路:

以下是使用 Java 语言实现的解决方案:

java">import java.util.PriorityQueue;public class MedianFinder {// 最大堆,存储较小的一半元素private PriorityQueue<Integer> smallerHalf;// 最小堆,存储较大的一半元素private PriorityQueue<Integer> largerHalf;public MedianFinder() {smallerHalf = new PriorityQueue<>((a, b) -> b - a);largerHalf = new PriorityQueue<>();}public void addNum(int num) {// 将元素添加到较小的一半中smallerHalf.offer(num);// 将较小一半中的最大元素移动到较大的一半中largerHalf.offer(smallerHalf.poll());// 如果较小的一半元素数量小于较大的一半,则将较大一半中的最小元素移动到较小的一半中if (smallerHalf.size() < largerHalf.size()) {smallerHalf.offer(largerHalf.poll());}}public double findMedian() {// 如果较小的一半元素数量等于较大的一半,则中位数为两个堆顶元素的平均值if (smallerHalf.size() == largerHalf.size()) {return (smallerHalf.peek() + largerHalf.peek()) / 2.0;} else {// 否则,中位数为较小一半的堆顶元素return smallerHalf.peek();}}public static void main(String[] args) {MedianFinder medianFinder = new MedianFinder();medianFinder.addNum(1);medianFinder.addNum(2);System.out.println(medianFinder.findMedian()); medianFinder.addNum(3);System.out.println(medianFinder.findMedian()); }
}

在上述代码中,我们使用两个优先队列(PriorityQueue)来维护数据流的中位数。一个优先队列(smallerHalf)用于存储较小的一半元素,另一个优先队列(largerHalf)用于存储较大的一半元素。

'addNum' 方法用于将新的元素添加到数据结构中。它首先将元素添加到较小的一半中,然后将较小一半中的最大元素移动到较大的一半中。如果较小的一半元素数量小于较大的一半,则将较大一半中的最小元素移动到较小的一半中,以保持两个堆的大小平衡。

'findMedian' 方法用于返回当前所有元素的中位数。如果较小的一半元素数量等于较大的一半,则中位数为两个堆顶元素的平均值。否则,中位数为较小一半的堆顶元素。

在 'main' 方法中,我们创建了一个 'MedianFinder' 对象,并使用 'addNum' 方法添加了一些元素。然后,我们使用 'findMedian' 方法获取并打印当前的中位数。

(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)


http://www.ppmy.cn/news/1519018.html

相关文章

深入理解linux内核hung_task机制,最全!原创!

背景 最近的一个项目里&#xff0c;发生的问题近乎多半都是hangdetect的问题&#xff0c;之前一直对这种问题总是一知半解&#xff0c;发现主要是因为对此种维测方案(hangdetect/hangtask/watchdog/hungdetect)的理解不够深刻&#xff0c;而更深层次的原因是对于内核的各种机(…

基于JavaWeb开发的Java+Springboot+Vue+elememt美食论坛平台设计实现

基于JavaWeb开发的JavaSpringbootVueelememt美食论坛平台设计实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各…

夸父追日:第七章 回溯算法part02

今日收获&#xff1a;组合总和&#xff0c;组合总和Ⅱ&#xff0c;分割回文串 代码随想录&#xff1a;for循环横向遍历&#xff0c;递归纵向遍历&#xff0c;回溯不断调整结果集。 1. 组合总和 题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 思…

OpenCV小练习:人脸检测

OpenCV自带人脸检测模型&#xff0c;拿来就能用。所以“人脸检测”这个任务对于OpenCV而言真是太简单了——感叹一下&#xff1a;OpenCV太强大了&#xff01;相关的介绍文章在网上可以搜到很多&#xff0c;原本我觉得没必要再写一篇了。结果我在写练习代码的时候&#xff0c;还…

认识人工智能(AI,Artificial Intelligence)

人工智能(AI, Artificial Intelligence)是当今科技领域最引人注目的前沿技术之一。它的影响已渗透到各行各业,从日常生活中的虚拟助手到复杂的工业自动化系统,AI 的应用无处不在。本文将详细探讨人工智能的定义与发展历程、学习人工智能的目的、人工智能在实际生活中的应用…

MyBatis中的#{}和${}区别、ResultMap使用、MyBatis常用注解方式、MyBatis动态SQL

#{}和${}区别&#xff1a; #{}&#xff1a;是占位符&#xff0c;采用预编译的方式sql中传值&#xff0c;防止sql注入&#xff0c;如果我们往sql中列值传递一般使用 #{}。 ${}&#xff1a;采用字符串拼接的方式直接拼接到sql语句中&#xff0c;一般不用于sql列值传递&#xf…

量化投资策略与技术学习PART1.1:量化选股之再谈多因子模型(二)

在上一个多因子模型中&#xff0c;我手动对各个因子进行了回测&#xff0c;但是数据结果并不是十分理想&#xff0c;难道基本面指标真的和股票走势关系不大么&#xff1f; 这里我还是准备再测试一下&#xff0c;策略如下&#xff1a; &#xff08;1&#xff09;首先我获取了一下…

计算机学习

不要只盯着计算机语言学习&#xff0c;你现在已经学习了C语言和Java&#xff0c;暑假又规划学习Python&#xff0c;最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言&#xff0c;沿着这个方向继续往后学习知识就行。计算机语言是学不完的&#xff0c;而未来就…

【C++20】携程库基础知识

文章目录 参考 参考 协程革命

如何识别视频里的声音转化为文字?视频转文字方法

如何识别视频里的声音转化为文字&#xff1f;识别视频声音转文字技术&#xff0c;不仅极大地提升了信息处理的效率&#xff0c;还促进了跨语言沟通和文化交流。在全球化背景下&#xff0c;它成为了连接不同语言群体的桥梁。此外&#xff0c;随着人工智能技术的不断进步&#xf…

【Python】标准库的使用

Python 通过模块来体现“库” 降低了程序猿的学习成本提高了程序的开发效率 库 就是是别人已经写好了的代码&#xff0c;可以让我们直接拿来用 荀子曰: “君子性非异也&#xff0c;善假于物也” 一个编程语言能不能流行起来&#xff0c;一方面取决于语法是否简单方便容易学习…

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记 本文介绍通义实验室最新的多模态手机智能体工作——Mobile-Agent。 一、大模型智能体背景 1.1 大模型智能体的优势 随着大模型的高速发展&#xff0c;大模型智能体成为热门研究方向&#xff0c;受到工业界和学术…

手把手教你从开发进度划分测试

一.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff1a;软件单元测试的对象是可独立编译或汇编的程序模块。测试的对象是软件测试中的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;TDD&#xff1a;测试驱动开发&#xff09;…

2024.9.1 刷题总结

2024.9.1 **每日一题** 1450.在既定时间做作业的学生人数&#xff0c;这是一道简单的模拟题&#xff0c;我们只需要判断每个学生的作业时间是否包含询问时间即可&#xff0c;具体判断方法为开始时间小于等于访问时间&#xff0c;结束时间大于等于访问时间。 class Solution { …

SparkShop开源商城 uploadFile 任意文件上传漏洞复现

1 产品简介 SparkShop开源商城&#xff08;也被称为星火商城&#xff09;是一款基于ThinkPHP6和Element UI的开源免费可商用的高性能商城系统。适用于各类电商场景&#xff0c;包括但不限于B2C商城、新零售、分销商城等。无论是初创企业还是成熟品牌&#xff0c;都可以通过Spar…

Ubuntu下安装NVIDIA-SMI

环境 显卡&#xff1a;gt1030 系统&#xff1a;Ubuntu22.04 安装 1、查询显卡GeForce GT 1030 rootapq-K07-C236:/home# lspci 00:00.0 Host bridge: Intel Corporation 8th/9th Gen Core 8-core Desktop Processor Host Bridge/DRAM Registers [Coffee Lake S] (rev 0d) 0…

深入理解Java序列化:从入门到实践

在前面的学习中我们简单的学习到了对象流的使用&#xff0c;我们先来回顾一下 对象流 在Java中&#xff0c;对象流是一种特殊的输入输出流&#xff0c;用于处理对象的序列化和反序列化操作。对象流主要包括ObjectOutputStream和ObjectInputStream两个类。 ObjectOutputStrea…

10分钟了解OPPO中间件容器化实践

背景 OPPO是一家全球化的科技公司&#xff0c;随着公司的快速发展&#xff0c;业务方向越来越多&#xff0c;对中间件的依赖也越来越紧密&#xff0c;中间件的集群的数量成倍数增长&#xff0c;在中间件的部署&#xff0c;使用&#xff0c;以及运维出现各种问题。 1.中间件与业…

华为2024年秋招-结构与材料工程师-结构方向-机试题(四套)(每套四十题)

华为2024年招聘-结构与材料工程师-结构方向-机试题&#xff08;四套&#xff09;&#xff08;每套四十题&#xff09; 岗位——结构与材料工程师 岗位意向——结构 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff…

【hot100篇-python刷题记录】【跳跃游戏】

R6-贪心算法 符合贪心的原因是&#xff1a; 我们要走到最后可以每次都选择尽可能远的来走&#xff0c;其次&#xff0c;能走到该步意味着该步以前都能到达。因此&#xff0c;局部最优解可以代表全局最优解。 class Solution:def canJump(self, nums: List[int]) -> bool:#最…