排序-读取数据流并实时返回中位数

目录

一、问题描述

二、解题思路

1.顺序表排序法

2.使用大根堆、小根堆

三、代码实现

1.顺序表排序法实现

2.大根堆、小根堆法实现

四、刷题链接


一、问题描述

二、解题思路

1.顺序表排序法

        (1)每次读取一个数就对列表排一次序,对排序过后的列表找中位数

        (2)找中位数时注意顺序表长度,如果为奇数则找中间元素直接返回,如果是偶数,需要找中间两个元素求平均数作为中位数返回。

        这种方法效率较低,下面提供一种效率高的方法,利用了堆调整速度快的特点,提高效率。

2.使用大根堆、小根堆

        小根堆里放较大的一半元素,大根堆放较小的一半元素,之所以这样放,我们举个例子说明一下。

注意:保持  0=<小根堆元素数量-大根堆元素数量<=1

        新加入元素的调整流程:新读取的元素并不一定是序列中较大的一半,新读取元素放入小根堆中,此时小根堆调整,根节点是小根堆中最小的元素(是序列中较小一半的元素),放入大根堆中,然后平衡两边的数量关系,保持上面列出的条件。        

三、代码实现

1.顺序表排序法实现

import java.util.*;

public class Solution {
    List<Integer> sortedList=new ArrayList<>();
    public void Insert(Integer num) {
        sortedList.add(num);
        sortedList.sort(new Comparator<Integer>(){
            @Override
            public int compare(Integer a,Integer b){
                return a-b;
            }
        });
        System.out.println(sortedList.toString());
    }

    public Double GetMedian() {
        int nowsize=sortedList.size();
        if(nowsize%2==1){
            //奇数元素取中间 
            return (double)sortedList.get(nowsize/2);
        }else{
            double n1=(double)sortedList.get(nowsize/2-1);
            double n2=(double)sortedList.get(nowsize/2);
            return (n1+n2)/2;
        }
    }
}

2.大根堆、小根堆法实现

import java.util.*;

public class Solution {
    //默认建立小根堆,用于存放较大的一半数据,根节点存放这些数据中最小的元素
    PriorityQueue<Integer> minHeap=new PriorityQueue<>();

    //默认建立大根堆,用于存放较小的一半数据,根节点存放这些数据中最大的元素
    PriorityQueue<Integer> maxHeap=new PriorityQueue<>((o1,o2)->o2.compareTo(o1));

    public void Insert(Integer num) {
        minHeap.offer(num);//此时加入的num可能是现有元素较小的一半的数据
        maxHeap.offer(minHeap.poll());//将小根堆中最小元素加入maxHeap
        if(maxHeap.size()>minHeap.size()){//平衡两个堆中的数量
            minHeap.offer(maxHeap.poll());
        }
    }

    public Double GetMedian() {
        double res=0.0;
        if((maxHeap.size()+minHeap.size())%2==0){//偶数个
            res=((double)minHeap.peek()+(double)maxHeap.peek())/2;
        }else{//奇数个,返回minHeap根节点元素
            res=(double)minHeap.peek();
        }
        return res;
    }
}

四、刷题链接

数据流中的中位数_牛客题霸_牛客网

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python-微分方程计算

首先导入数据 import numpy as np from scipy.integrate import odeint from scipy.optimize import minimize import matplotlib.pyplot as pltdata np.array([[30, 4],[47.2, 6.1],[70.2, 9.8],[77.4, 35.2],[36.3, 59.4],[20.6, 41.7],[18.1, 19],[21.4, 13],[22, 8.3],[2…

初识 peerDependencies

目录 初步认识 peerDependencies semver 介绍 # 摘要 # 简介 # 语义化版本控制规范&#xff08;SemVer&#xff09; # 合法语义化版本的巴科斯范式语法 # 为什么要使用语义化的版本控制&#xff1f; # FAQ 示例讲解&#xff1a;vue-router 插件 # 说明 声明 验证 初…

电子阅览室有何作用

随着互联网的快速发展&#xff0c;电子阅览室逐渐成为人们获取知识的新方式。它为读者提供了便捷、高效的阅读体验&#xff0c;具有诸多作用。首先&#xff0c;电子阅览室拥有丰富的电子书籍资源&#xff0c;涵盖了各个领域的知识。无论是文学作品还是学术论文&#xff0c;读者…

商城项目【尚品汇】08异步编排-01基础篇

文章目录 1.线程的创建方式1.1继承Thread类&#xff0c;重写run方法1.2实现Runnable接口&#xff0c;重写run方法。1.3实现Callable接口&#xff0c;重新call方法1.4以上三种总结1.5使用线程池创建线程1.5.1线程池创建线程的方式1.5.2线程池的七大参数含义1.5.3线程池的工作流程…

探索 Docker:容器化技术的未来

1. 引言 在传统的软件开发和部署过程中&#xff0c;经常会遇到诸如“开发环境和生产环境不一致”、“依赖环境冲突”、“部署困难”等问题。为了解决这些问题&#xff0c;容器化技术应运而生。Docker 作为最受欢迎的容器平台之一&#xff0c;已经在业界得到广泛应用。它不仅简化…

【C++】——Stack与Queue(含优先队列(详细解读)

前言 之前数据结构中是栈和队列&#xff0c;我们分别用的顺序表和链表去实现的&#xff0c;但是对于这里的栈和队列来说&#xff0c;他们是一种容器&#xff0c;更准确来说是一种容器适配器 ✨什么是容器适配器&#xff1f; 从他们的模板参数可以看出&#xff0c;第二个参数模…

摆脱Jenkins - 使用google cloudbuild 部署 java service 到 compute engine VM

在之前 介绍 cloud build 的文章中 初探 Google 云原生的CICD - CloudBuild 已经介绍过&#xff0c; 用cloud build 去部署1个 spring boot service 到 cloud run 是很简单的&#xff0c; 因为部署cloud run 无非就是用gcloud 去部署1个 GAR 上的docker image 到cloud run 容…

张大哥笔记:经济下行,这5大行业反而越来越好

现在人们由于生活压力大&#xff0c;于是就干脆降低自己的欲望&#xff0c;只要不是必需品就不买了&#xff0c;自然而然消费也就降低了&#xff0c;消费降级未必是不好的现象&#xff01; 人的生物本能是趋利避害&#xff0c;追求更好的生存和发展空间&#xff0c;回避对自己有…

C++使用thread_local实现每个线程下的单例

对于一个类&#xff0c;想要在每个线程种有且只有一个实例对象&#xff0c;且线程之间不共享该实例&#xff0c;可以按照单例模式的写法&#xff0c;同时使用C11提供的thread_local关键字实现。 在单例模式的基础上&#xff0c;使用thread_local关键字修饰单例的instance&…

Redis原理篇——哨兵机制

Redis原理篇——哨兵机制 1.Redis哨兵2.哨兵工作原理2.1.哨兵作用2.2.状态监控2.3.选举leader2.4.failover 1.Redis哨兵 主从结构中master节点的作用非常重要&#xff0c;一旦故障就会导致集群不可用。那么有什么办法能保证主从集群的高可用性呢&#xff1f; 2.哨兵工作原理 …

【Python】读取文件夹中所有excel文件拼接成一个excel表格 的方法

我们平常会遇到下载了一些Excel文件放在一个文件夹下&#xff0c;而这些Excel文件的格式都一样&#xff0c;这时候需要批量这些文件合并成一个excel 文件里。 在Python中&#xff0c;我们可以使用pandas库来读取文件夹中的所有Excel文件&#xff0c;并将它们拼接成一个Excel表…

AI助教时代:通义千问,让学习效率翻倍?

全文预计1100字左右&#xff0c;预计阅读需要5分钟。 关注AI的朋友知道&#xff0c;在今年5月份以及6月份的开端&#xff0c;AI行业可谓是风生水起&#xff0c;给了我们太多的惊喜和震撼&#xff01;国内外各家公司纷纷拿出自己憋了一年的产品一决雌雄。 国内有文心一言、通义千…

大模型相关:ChatGPT的原理与架构

一、大模型面临的挑战 1.1 Transformer模型的缺陷&#xff1a; 与RNN相比Transformer面临以下挑战&#xff1a; 并行计算能力不足。RNN需要按序处理序列数据中的每个时间步&#xff0c;这限制了它在训练过程中充分利用现代GPU的并行计算能力&#xff0c;从而影响训练效率。长…

FastAPI给docs/配置自有域名的静态资源swagger-ui

如果只是要解决docs页面空白的问题&#xff0c;可先看我的这篇博客&#xff1a;FastAPI访问/docs接口文档显示空白、js/css无法加载_fastapi docs打不开-CSDN博客 以下内容适用于需要以自用域名访问swagger-ui的情况&#xff1a; 1. 准备好swagger-ui的链接&#xff0c;如&am…

STM32H750启动和内存优化(分散加载修改)

前些日子有个朋友一直给我推荐STM32H750这款芯片&#xff0c;说它的性价比&#xff0c;说它多么多么好。于是乎&#xff0c;这两天试了试&#xff0c;嚯&#xff0c;真香&#xff01;我们先看看基本配置 这里简单总结下&#xff0c;cortex-m7内核&#xff0c;128k片内flash …

htb-linux-6-beep

nmap web渗透 目录扫描 漏洞关键词 shell py脚本执行 flag root 目前的权限 nmap root

Django 视图类

在Django框架中&#xff0c;视图类&#xff08;Class-based views&#xff0c;简称CBVs&#xff09;提供了一个面向对象的方式来定义视图。这种方式可以让你通过创建类来组织视图逻辑&#xff0c;而不是使用基于函数的视图&#xff08;Function-based views&#xff0c;简称FBV…

109、python-第四阶段-6-多线程编程

单线程&#xff1a; import threading import timedef sing():while True:print("我在唱歌")time.sleep(1) def dance():while True:print("我在跳舞")time.sleep(1) if __name__"__main__":sing()dance()多线程&#xff1a; import threading…

嵌入式学习——Linux高级编程复习(进程)——day39

1. 进程 进程是计算机科学中的一个核心概念&#xff0c;它是操作系统进行资源分配和调度的基本单位&#xff0c;代表了一个正在执行中的程序实例。当一个程序被加载到内存并开始执行时&#xff0c;它就变成了一个进程。 1. 程序&#xff1a;存放在外存中的一段代码的集合 2. 进…

Java并发编程:线程生命周期

Java并发编程专栏 文章收录于Java并发编程专栏 线程生命周期 线程是Java并发编程的核心概念&#xff0c;理解线程生命周期对于编写高效的并发程序至关重要。本文将详细介绍 Java 线程的六种状态以及状态之间的转换关系&#xff0c;帮助读者更好地理解线程的行为。   在Java中…