热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

程序员面试金典——解题总结:9.18高难度题18.9随机生成一些数字并传入某个方法。编写一个程序,每当收到新数字时,找出并记录中位数。

#include#include#include#include#includeusi

#include
#include
#include
#include
#include using namespace std;
/*
问题:随机生成一些数字并传入某个方法。编写一个程序,每当收到新数字时,找出并记录中位数。
分析&#xff1a;题目的意思应该是&#xff1a;根据随机生成了k个数字之后&#xff0c;接下来每次再收到新数字时&#xff0c;找到中位数。简化问题&#xff1a;寻找中位数&#xff0c;什么是中位数&#xff1f;就是数组A排序之后&#xff0c;假设共有n个数字&#xff0c;如果n为奇数&#xff0c;那么A[n/2]即为中位数如果n为偶数&#xff0c;那么A[n/2 - 1] , A[n/2 - 1]累加之后除以2。假设我事先对之前的随机生成的元素组成的数组A排序&#xff0c;不妨假设不管n为奇数或者偶数&#xff0c;寻找的中位数都是A[n/2]&#xff0c;那么我可以事先取出中间3个数A[n/2 - 1],A[n/2]&#xff0c;A[n/2&#43;1]然后用新生成的数字和A[n/2]比较&#xff0c;如果A[n/2] > 生成的数字&#xff0c;那么新的中位数直接就是A[n/2 - 1]如果A[n/2] <生成的数字&#xff0c; A[n/2 &#43; 1]&#61; A[n/2]书上解法&#xff1a;
用两个优先级堆&#xff0c;大顶堆&#xff1a;存放小于中位数的值&#xff0c;小顶堆&#xff1a;存放大于中位数的值。则大顶堆的对顶是最大值&#xff0c;小顶堆的对顶是最小值。
如果:大顶堆的大小 > 小顶堆的元素大小&#xff0c;则大顶堆的堆顶为中位数&#61; &#xff0c;则大小顶堆的平均值为中位数。
只需要使得大顶堆的大小>&#61;小顶堆的大小。
有新元素生成&#xff0c;如果 新元素 <&#61; 中位数&#xff0c;放入大顶堆(即包含较小元素的那一堆)&#xff1b;> 小
如果插入新元素后&#xff0c;大顶堆元素个数 >&#61; 小顶堆元素个数&#43;2&#xff0c;说明较小的那一堆元素个数多了&#xff0c;将大顶堆的对顶移动到小顶堆大顶堆元素个数 <小顶堆元素个数&#xff0c;将小顶堆的对顶移动到大顶堆输入&#xff1a;
4(初始元素个数)
1 4 7 10
3(后续生成的新元素个数)
3 2 8
输出:
4.00(后续第一个新元素加入后的中位数&#xff0c;保留两位小数)
3.50
4.00关键:
1
用两个优先级堆&#xff0c;大顶堆&#xff1a;存放小于中位数的值&#xff0c;小顶堆&#xff1a;存放大于中位数的值。则大顶堆的对顶是最大值&#xff0c;小顶堆的对顶是最小值。
如果:大顶堆的大小 > 小顶堆的元素大小&#xff0c;则大顶堆的堆顶为中位数&#61; &#xff0c;则大小顶堆的平均值为中位数。
只需要使得大顶堆的大小>&#61;小顶堆的大小。
有新元素生成&#xff0c;如果 新元素 <&#61; 中位数&#xff0c;放入大顶堆(即包含较小元素的那一堆)&#xff1b;> 小
如果插入新元素后&#xff0c;大顶堆元素个数 >&#61; 小顶堆元素个数&#43;2&#xff0c;说明较小的那一堆元素个数多了&#xff0c;将大顶堆的对顶移动到小顶堆大顶堆元素个数 <小顶堆元素个数&#xff0c;将小顶堆的对顶移动到大顶堆
*/
class CompareMax
{
public:bool operator()(const int a ,const int b)const{return a > b ? true : false;}
};class CompareMin
{
public:bool operator()(const int a ,const int b)const{return a };//利用初始的数组产生两个堆&#xff0c;大顶堆存放较小部分元素&#xff0c;小顶堆存放较大部分元素&#xff0c;且满足: 小顶堆元素个数<&#61; 大顶堆元素个数 <&#61; 小顶堆元素个数&#43;1
void generateSet(vector& datas , multiset& maxHeap , multiset& minHeap )
{if(datas.empty()){return;}//初始先排序sort(datas.begin() , datas.end());int size &#61; datas.size();int middleNum &#61; (size &#43; 1) / 2;//将前半段小的放入到大顶堆中for(int i &#61; 0 ; i }double getMiddleNum(multiset& maxHeap , multiset& minHeap )
{int minSize &#61; maxHeap.size();int maxSize &#61; minHeap.size();double originalMiddleNum &#61; 0;//计算原始中位数&#xff0c;如果总元素个数是奇数个&#xff0c;那么原始中位数等于大顶堆的堆顶if( ( (minSize &#43; maxSize) & 1 ) &#61;&#61; 1){originalMiddleNum &#61; *(maxHeap.begin());}else{originalMiddleNum &#61; ( *maxHeap.begin() &#43; *minHeap.begin() ) / 2.0;}return originalMiddleNum;
}//根据输入的新元素&#xff0c;大顶堆和小顶堆&#xff0c;生成中位数
double generateMiddleNum(int value, multiset& maxHeap , multiset& minHeap )
{double originalMiddleNum &#61; getMiddleNum(maxHeap , minHeap);//比较如果&#xff1a;新元素 <&#61; 原始中位数&#xff0c;则插入到大顶堆(即较小部分的那一堆元素中)if( 1.0*value <&#61; originalMiddleNum ){maxHeap.insert(value);}else{minHeap.insert(value);}//如果大顶堆元素个数 >&#61; 小顶堆元素个数 &#43; 2 ,就把大顶堆的堆顶移除&#xff0c;并插入到小顶堆中int minSize &#61; maxHeap.size();int maxSize &#61; minHeap.size();if( minSize >&#61; maxSize &#43; 2){int value &#61; *maxHeap.begin();maxHeap.erase(maxHeap.begin());minHeap.insert(value);}//如果大顶堆元素个数 <小顶堆元素个数&#xff0c;就把小顶堆的堆顶移除&#xff0c;并插入到大顶堆中else if(minSize }void process()
{int originalNum , addNum ;vector datas;vector newDatas;int value;multiset maxHeap;multiset minHeap;double middleNum;cout.setf(ios::fixed);cout.precision(2);while(cin >> originalNum ){datas.clear();newDatas.clear();maxHeap.clear();minHeap.clear();for(int i &#61; 0 ; i > value;datas.push_back(value);}//生成初始的大顶堆和小顶堆generateSet(datas , maxHeap , minHeap);cin >> addNum;for(int i &#61; 0 ; i > value;//接下来对每次新输入的元素&#xff0c;生成中位数middleNum &#61; generateMiddleNum(value , maxHeap , minHeap);cout <}int main(int argc , char* argv[])
{process();getchar();return 0;
}



推荐阅读
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
author-avatar
诗雨妈咪201101102002
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有