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

【剑指Offer】41.数据流中的中位数

题目

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

数据范围:数据流中数个数满足 1≤n≤1000  ,大小满足 1≤val≤1000 
进阶: 空间复杂度O(n)  , 时间复杂度O(nlogn) 

示例1

输入:[5,2,3,4,1,6,7,0,8]

返回值:"5.00 3.50 3.00 3.50 3.00 3.50 4.00 3.50 4.00 "

说明:数据流里面不断吐出的是5,2,3...,则得到的平均数分别为5,(5+2)/2,3...

示例2

输入:[1,1,1]

返回值:"1.00 1.00 1.00 "

解答

源代码

import java.util.*;


public class Solution {
    List<Integer> val = new ArrayList<>();

    public void Insert(Integer num) {
        if (val.isEmpty()) {
            val.add(num);
        } else {
            int i;
            for (i = 0; i < val.size(); i++) {
                if (num < val.get(i)) {
                    break;
                }
            }
            val.add(i, num);
        }
    }

    public Double GetMedian() {
        int len = val.size();

        if (len % 2 == 1) {
            return (double)val.get(len / 2);
        } else {
            int left = val.get(len / 2 - 1);
            int right = val.get(len / 2);
            return (double)(left + right) / 2;
        }
    }
}

总结

为了便于找出中位数,我们每次在放入数据时都要对当前数据流进行排序,在集合中将数据按照递增序列顺序存储,这样获取中位数时就可以根据集合大小直接找到所需下标的数字,最后得到中位数。


http://www.kler.cn/a/106846.html

相关文章:

  • Go 语言中,golang结合 PostgreSQL 、MySQL驱动 开启数据库事务
  • python习题练习
  • 速盾:如何有效防止服务器遭受攻击?
  • 前端搭建低代码平台,微前端如何选型?
  • 数据产品:深度探索与案例剖析
  • 蓝队知识浅谈(上)
  • electron汇总
  • 【面试经典150 | 栈】最小栈
  • 音视频常见问题(六):视频黑边或放大
  • [开源]传统实体产业提供进销存管理解决方案,助传统企业降本增效
  • 点云从入门到精通技术详解100篇-基于尺度统一的三维激光点云与高清影像配准(续)
  • 【Linux】虚拟机项目部署与发布
  • Vue3-使用create-vue创建项目
  • 21个新的ChatGPT应用
  • 树莓派基金会近日发布了新版基于 Debian 的树莓派操作系统
  • 面试经典150题——Day23
  • 【纯离线】Ubuntu离线安装ntp时间同步服务
  • 汇总区间(Java)
  • 宏电5G RedCap工业智能网关获首个中国移动5G物联网开放实验室5G及轻量化产品能力认证
  • 企业管理系统有哪些?
  • apisix之插件开发,包含java和lua两种方式
  • Framework -- 系统架构
  • 利用经典热门电视剧写爆款公众号爆文10万+阅读量
  • 华为云 CodeArts Snap 智能编程助手 PyCharm 插件安装与使用指南
  • 傅里叶在图像中的应用FFT算法---fft实战应用案例
  • jvm线上异常排查流程