名企面试:Aamazon笔试题(Find median in a stream )

来源:互联网 发布:母亲的心意你知多少? 编辑:程序博客网 时间:2024/06/02 04:52

Aamazon笔试题(Find median in a stream )

题意:
Given an input stream of n integers the task is to insert integers to stream and print the median of the new stream formed by each insertion of x to the stream.
给你一个输入流,会往这个流中插入整数,你的任务是每次插入一个整数之后计算当前的中位数是多少。
Example
流的数据 : 5, 15, 1, 3
5 进入流 –> 中位数 5 (5)
15 进入流 –> 中位数 10 (5, 15)
1 进入流 –> 中位数 5 (5, 15, 1)
3 进入流 –> 中位数 4 (5, 15, 1, 3)
输入描述:
第一行是n的大小,接着输入n个数。
输出描述:
每一测试输出n个数,表示插入第i个数之后的中位数。
Constraints:
1<=N<=10^5+7
1<=x<=10^5+7
Example:
Example:
Input:
4
5
15
1
3
Output:
5
10
5
4
分析:
笔试和面试题都有一个很大的规律,就是一定可以直接想到最暴力的方法,所以在面试的时候,不要着急,先给出暴力方法,在思考更好的方法,不要直接就去想最优的方法。对于这个题,每次插入数字之后,我们可以之间快速排序取中间即可其时间复杂度是O(n*n*logn),还可以用插入排序,因为每一个的数据都是有序的,插入排序会更好,如果在定位的时候用到二分又会进一步提高性能。之后才是怎样更进一步的解决这个问题呢?中位数?就是中间的数,保证左边的所有数字小于或者等于这个数,右边的所有数字大于或者等于这个数,而且,左右两边的数字的个数相差不超过1。
如果我们每一次插入一个新的数时,都维护两个部分,使得左边的部分小于或等于这个数,右边的部分大于或等于这个数,并保证左右两边的数字的个数相差不超过1。此时的中位数就之后三种情况:
1、左边的个数>右边的个数: 取出左边最大的一个数就是中位数
2、左边的个数<右边的个数: 取出右边最小的一个数就是中位数
3、左边的个数=右边的个数: (取出左边最大的一个数就是中位数 + 取出右边最小的一个数就是中位数)/ 2,就是中位数。
每次我们都要取出左边最大值或者右边的最小值,因此我们想到一个数据结构堆,左边申请一个大根堆,右边申请一个小根堆。维护这两个堆即可。
时间复杂度是O(nlogn)。空间复杂度是O(n)。

Code:

/** *Author: xiaoran *座右铭:既来之,则安之 */#include<iostream>#include<stdio.h>#include<algorithm>#include<math.h>#include<set>#include<map>#include<queue>#include<vector>#include<string>#include<string.h>using namespace std;typedef long long LL;const int MAXN = 1005;int main() {    //code    int n,x;    while(cin>>n){        vector<int> a;        priority_queue <int> minheap;//count left part 值越大优先级越大        priority_queue <int,vector<int>,greater<int> > maxheap;// right part值越小优先级越大        int minsize,maxsize,current_med;        minsize = maxsize = current_med = 0;        for(int i=0;i<n;i++){           cin>>x;           a.push_back(x);           //如果当前的值大于中位数,就插入到右边的小根堆           if(x <= current_med){               minheap.push(x);               minsize ++;           }           else{               maxheap.push(x);               maxsize ++;           }           //有一边超过了两个数,证明二者必须分开           if(maxsize - minsize >= 2){               int tmp = maxheap.top();               maxheap.pop();               maxsize --;               minheap.push(tmp);               minsize ++;           }           if(minsize - maxsize >= 2){               int tmp = minheap.top();               minheap.pop();               minsize --;               maxheap.push(tmp);               maxsize ++;           }           //cout<<"minsize:"<<minsize<<endl;           //cout<<"maxsize:"<<maxsize<<endl;           //根据三种情况得到中位数           if(maxsize == minsize){               current_med = (maxheap.top() + minheap.top()) / 2;           }           if(maxsize < minsize){               current_med = minheap.top();           }           if(maxsize > minsize){               current_med = maxheap.top();           }            cout<<current_med<<endl;                   }    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 耳鸣嘴溃疡眼流泪上火怎么办 孩子看电视总挤眼睛怎么办 小孩老是咳嗽有痰怎么办 长时间看手机眼睛模糊怎么办 长时间看电脑眼睛模糊怎么办 手机玩多了眼睛模糊怎么办 手机看多了眼睛模糊怎么办 孩子玩手机眼睛红怎么办 手机玩多了眼睛红怎么办 手机看久了眼花怎么办 玩手机眼睛近视了怎么办 近视了怎么办30个字 吃了长牙的土豆怎么办 鸡蛋和土豆吃了怎么办 狗狗眼睛流血水怎么办 石粉粘土干了怎么办 樱花针管笔干了怎么办 想学linux不会c语言怎么办 被摩托车排气管烫伤了怎么办 泡泡糖粘在衣服上怎么办 皮卡书屋办卡怎么办 照证件照齐刘海怎么办 哈挺机床卡刀了怎么办 绝地求生卡在登陆页面怎么办 白鞋子长霉了怎么办 幸福树树干烂了怎么办 花椒树树叶掉落枝干发黑怎么办 茉莉枝干变干了怎么办 冲风了头蒙怎么办 不小心把腰扭了怎么办 白衣服发霉有小黑点怎么办 佛肚竹的枝叶都枯了怎么办 山竹一天吃多了怎么办 水养竹子叶子发黄怎么办 龙竹的竹杆黄了怎么办 散尾竹叶子发黑怎么办 给姐姐打工不发工资怎么办? 水培红掌叶子发黄怎么办 盆竹的叶尖发黄怎么办 养富贵竹水里怎么生小虫怎么办 盆栽金银花叶子全部落掉怎么办