Microsoft中位数

#pragma once
#include<vector>
#include<list>
class Solution
{
public:
    Solution() :members(NULL) {};
    std::vector<double> flowmedian(std::vector<std::vector<int> >& operations);
    void BinaryTree(int left,int right, int num);
    std::vector<int> members;
};


#include "Solution.h"

std::vector<double> Solution::flowmedian(std::vector<std::vector<int>>& oper)
{
    std::vector<double> retVec;
    for (auto member : oper)
    {
        if (member.size() == 1)
        {
            if (member.front() == 2 && members.size() > 0)
            {
                double median = 0;
                if (members.size() & 0x01 == 1)
                    retVec.push_back(members[members.size() >> 2]);
                else {
                    median = static_cast<double>(members[members.size() >> 2] + members[members.size() >> 2 - 1]) / 2;
                    retVec.push_back(median);
                }
            }
            else
                retVec.push_back(-1);
        }
        if (member.size() == 2)
        {
            BinaryTree(0, members.size() - 1, member[1]);
        }
    }
    return retVec;

}

void Solution::BinaryTree(int left, int right ,int num)
{
    auto it = members.begin();
    if (members.size() == 0)
    {
        members.insert(it, num);
        return;
    }
    if(left > right)
        return;
    
    if (left == right)
    {            
        if (num > members[left])
            members.insert(it + left + 1, num);
        else
            members.insert(it + left, num);
    }
    
    if (left < right)
    {
        if (num < members[(left + right) / 2])
        {
            BinaryTree(left, (left + right) / 2,num);
        }
        else if (num > members[(left + right) / 2])
        {
            BinaryTree((left + right) / 2+1, right, num);

        }
        else {
            members.insert(it + (left + right) / 2, num);
        }
    }
    
}

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "Solution.h"
int main()
{
    int arr[10] = { 7,3,9,8,7,4,2,9,8,1 };
    Solution so;
    int siz = sizeof(arr)/sizeof(int);
    for (int i=0; i<siz;i++)
    {
        so.BinaryTree(0, i-1, arr[i]);
    }
   
    std::cout << "Hello World!\n";
}

 

描述(考察的是堆排序)用堆排序再实现一下

有一个源源不断的吐出整数的数据流,假设你有足够的空间来保存吐出的数。请设计一个名叫MedianHolder的结构,MedianHolder可以随时取得之前吐出所有数的中位数。
[要求]
1. 如果MedianHolder已经保存了吐出的N个数,那么将一个新数加入到MedianHolder的过程,其时间复杂度是O(logN)。
2. 取得已经吐出的N个数整体的中位数的过程,时间复杂度为O(1)
 
每行有一个整数

 

posted @ 2021-06-18 16:40  hitzzq  阅读(38)  评论(0编辑  收藏  举报