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)。
[要求]
1. 如果MedianHolder已经保存了吐出的N个数,那么将一个新数加入到MedianHolder的过程,其时间复杂度是O(logN)。
2. 取得已经吐出的N个数整体的中位数的过程,时间复杂度为O(1)
每行有一个整数