2011年计算机联考真题——寻找2个序列的中位数
来源:互联网 发布:互动投影软件下载 编辑:程序博客网 时间:2024/06/03 08:26
思路:
设定两个升序序列分别为A与B,中位数分别为a和b。
1)如a=b,则即为所求,算法结束。
2)当a< b时,抛弃A的较小的一般和B的较大的一半,并且舍弃的长度必须相等。
3)当 a > b时,抛弃A的较大的一般和B的较小的一半,并且舍弃的长度必须相等。
重复复进行1,2,3过程,知道两个序列均只含一个元素为止,较小者即为所求。
代码如下:
#include <iostream>using namespace std;int Median(int* A,int* B,int n){ int s1 = 0 , d1 = n-1, m1 = 0; int s2 = 0 , d2 = n-1, m2 = 0; while(s1 != d1 || s2 != d2){ m1 = (s1+d1) / 2; m2 = (s2+d2) / 2; if(A[m1] == B[m2]){ return A[m1]; } if(A[m1] < B[m2]){ if((s1+d1)%2 == 0){ s1 = m1; d2 = m2; }else{ s1 = m1+1; d2 = m2; } }else{ if((s2+d2)%2 == 0){ d1 = m1; s2 = m2; }else{ d1 = m1; s2 = m2+1; } } } return (A[s1]<B[s2])?A[s1]:B[s2]; }void Print(int* A,int n){ for(int i = 0 ; i < n ; i++){ cout<<A[i]<<" "; } }int main(){ int A[5] = {11,13,15,17,19}; int B[5] = {2,4,6,8,20}; cout<<"第一个数组为:"<<endl; Print(A,5); cout<<endl; cout<<"第二个数组为:"<<endl; Print(B,5); cout<<endl; cout<<"中位数为:"; int median = Median(A,B,5); cout<<median<<endl; return 0;}
截图:
阅读全文
1 0
- 2011年计算机联考真题——寻找2个序列的中位数
- 2016年计算机联考真题——寻求最大子集和的差
- 2010年计算机联考真题——一维数组循环左移
- 2013年计算机联考真题——确定主元
- 2014年计算机联考真题——带权路径长度之和
- hackerrank挑战题——寻找正在运行的中位数
- 2个有序数组,寻找他们合并之后的中位数
- 减治算法之寻找两个递增序列的中位数
- 10G个整数的文件中寻找中位数
- 2:寻找中位数
- 查找——两个有序序列的中位数
- 寻找3个数的中位数
- 寻找两个数组的中位数
- 寻找无序数组的中位数
- 寻找一个数组的中位数
- Google算法题:寻找中位数
- 关于在一个序列中寻找中位数和第K大的数(在两个等长有序数组中寻找中位数)
- 寻找中位数
- 面试经常问到的问题(自己记录)
- 杭电 acm 1720 输入16进制,输出10进制
- 链表求和
- 多校联萌第三场 问题 A: Kick Ass
- 圣杯布局和双飞翼布局
- 2011年计算机联考真题——寻找2个序列的中位数
- Datatable的一些功能参数
- Mysql SQL优化&执行计划
- vue.js学习笔记-12
- ROS机器人操作系统暑期学校总结和感悟
- ReactNative——UI5.ListView实现带标题的列表
- 去重复方法小集
- 使用DVD光盘或者ISO作为本地YUM源
- 【C++】【LeetCode】75. Sort Colors