牛客网面试必刷TOP101-04堆/栈/队列BM48 数据流中的中位数

描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用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.如何得到一个数据流的中位数?如果从数据流中读出奇数个数值

2.那么中位数就是所有数值排序之后位于中间的数值。

3.如果从数据流中读出偶数个数值,

4.那么中位数就是所有数值排序之后中间两个数的平均值。

5.我们使用Insert()方法读取数据流,

6.使用GetMedian()方法获取当前读取数据的中位数。

7.数据范围:数据流中数个数满足n大于等于1小于等于1000,

大小满足val大于等于1小于等于1000

8.进阶:空间复杂度O(n),时间复杂度O(nlogn)

二、解题思路

1.使用类似插入排序的思想,使用一个数组容纳数据

2.每次将新增加的数字插入到刚好比自己小的数字之后比自己数字大的数字之前的位置

3.如果数组中的数据是奇数,直接返回中间的数字

4.如果数据数量是偶数,返回,数据数量/2的索引和数据数量/2+1的索引的值的和/2(平均值)

三、具体步骤

使用的语言是C

int arr[1000], n = 0;

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num int整型 
 * @return 无
 */
void Insert(int num ) {
    // write code here
    bool inserted = false;
    for(int i = 0; i < n; i++) {
        if(arr[i] > num) {
            for(int j = n; j > i; j--) {
                arr[j] = arr[j - 1];
            }
            arr[i] = num;
            inserted = true;
            n++;
            break;
        }
    }
    if(!inserted) {
        arr[n++] = num;
    }
}
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return double浮点型
 */
double GetMedian() {
    // write code here
    double ans = 0;
    if(n%2) {
        ans = (double)arr[n/2];
        return ans;
    }
    ans = ((double)arr[n/2] + (double)arr[n/2 - 1]) / 2;
    return ans;
}

你可能感兴趣的:(面试,职场和发展)