• 【剑指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 "

    解答

    源代码

    1. import java.util.*;
    2. public class Solution {
    3. List val = new ArrayList<>();
    4. public void Insert(Integer num) {
    5. if (val.isEmpty()) {
    6. val.add(num);
    7. } else {
    8. int i;
    9. for (i = 0; i < val.size(); i++) {
    10. if (num < val.get(i)) {
    11. break;
    12. }
    13. }
    14. val.add(i, num);
    15. }
    16. }
    17. public Double GetMedian() {
    18. int len = val.size();
    19. if (len % 2 == 1) {
    20. return (double)val.get(len / 2);
    21. } else {
    22. int left = val.get(len / 2 - 1);
    23. int right = val.get(len / 2);
    24. return (double)(left + right) / 2;
    25. }
    26. }
    27. }

    总结

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

  • 相关阅读:
    Armv8/Armv9 Cache知识大纲分享--思维导图
    minitest使用笔记1
    Linux之open/close/read/write/lseek记录
    重点| 系统集成项目管理工程师考前50个知识点
    3.前端开发就业前景
    通讯/服务器公司 测试|测试开发 面试真题|面经 汇总
    公共经济学考试题库完整
    硬件扫盲系列-接口
    SpringDataRedis的序列化方式(二)
    Spring SPI
  • 原文地址:https://blog.csdn.net/qq_57438473/article/details/134087358