[ACM]两个中位数

题目:

     
 
设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数。试设计一个O(logn)时间算法,找出X和Y的2n个数的中位数

思路:

1.要求时间为O(logn),所以应该是用分治法或递归

a: 1  3  5 7 9 中位数 am=5

b: 2 4 6 8 10  中位数bm=6

因为 am< bm 所以中位数必定在 579 和246中间

再取a‘,b‘的中位数, 因为 am‘=7 ,bm‘=4  am‘>bm‘

所以中位数必定在 57 46 之间

因为只剩下 4个数, 所以 中位数是其中的四个求和.

2. get_Mid(int[] a , int [] b, int n){

if(n<1): return-1

if(n=1): return a[0]+b[0]

else:

a_med= a[] 的中位数

b_med= b[] 的中位数

if a_med<b_med{

get_Mid(a[a_med,n] , b[1,b_med ], int n-a_med)

}

if a_med>b_med{

get_Mid(a[1,a_med] , b[a_med,n ], int n-a_med)

}

if a_med=b_med{

return a_ med

}

}

时间: 2024-10-22 12:56:20

[ACM]两个中位数的相关文章

ACM两个士兵打牌

Two bored soldiers are playing card war. Their card deck consists of exactly n cards, numbered from 1 to n, all values are different. They divide cards between them in some manner, it's possible that they have different number of cards. Then they pla

ACM 阶乘数位数

描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)? 输入 首行输入n,表示有多少组测试数据(n<10)随后n行每行输入一组测试数据 N( 0 < N < 1000000 ) 输出 对于每个数N,输出N!的(十进制)位数. 样例输入 3 1 3 32000 样例输出 1 1 130271 /* NYOJ69 阶乘数位长度 * 方法一: * 可设想n!的结果是不大于10的M次幂的数,即n!<=1

安全狗两个中危提权+NET提权

1.循环加组复现 for /l %%i in (1,1,1000) do @net user admin admin /add&@ net localgroup administrators admin /add 这曾经是安全狗最早爆出的安全狗漏洞 但是安全狗很快的在之后的版本修复了 上月某非盈利安全研究小组研究人员发现其实安全狗只是阻截了系统的net/net1执行  同时把你net放到别的目录就算有执行权限你也无法执行  因为他是一棒子打死  但是可以突破执行net1   (没图说个jb) 正

求两个有序数组的中位数

这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉.后来搜了一下leetcode的难度分布表(leetcode难度及面试频率)才发现,该问题是难度为5的问题,真是小看了它!网上搜了很多答案,但是鲜见简明正确的解答,唯有一种寻找第k小值的方法非常好,在此整理一下. 首先对leetcode的编译运行吐槽一下:貌似没有超时判断,而且small和large的数据集相差很小.此题一开始我采用最笨的方法去实现,利

两个有序数组中查找第K大数

题目:两个数组A.B,长度分别为m.n,即A(m).B(n),分别是递增数组.求第K大的数字. 方法一: 简单的办法,使用Merge Sort,首先将两个数组合并,然后在枚举查找.这个算法的时间复杂度是O(m+n).空间复杂度也是O(M+n). 这个方法其实没有考虑到有第K大数为两个相同数字的情况. 方法二: 这里需要两个前提条件, 1.如果K是中位数,则(M+n)是奇数还是偶数是有关系的.如果是奇数,那么中位数唯一,如果是偶数就有两个中位数,可以随便取一个. 2.如果找到的第K大数是x,假如在

算法导论 第三版 9.3-8

1 # -*- coding: utf-8 -*- 2 import math 3 4 def merge(l1, l2): 5 list_merge = [] 6 i = j = 0 7 while i < len(l1) and j < len(l2): 8 if l1[i] < l2[j]: 9 list_merge.append(l1[i]) 10 i += 1 11 else: 12 list_merge.append(l2[j]) 13 j += 1 14 if i == l

算法导论-顺序统计

目录 1.问题的引出-求第i个顺序统计量 2.方法一:以期望线性时间做选择 3.方法二(改进):最坏情况线性时间的选择 4.完整测试代码(c++) 5.参考资料 内容 1.问题的引出-求第i个顺序统计量 什么是顺序统计量?及中位数概念 在一个由元素组成的集合里,第i个顺序统计量(order statistic)是该集合第i小的元素.例如,最小值是第1个顺序统计量(i=1),最大值是第n个顺序统计量(i=n).一个中位数(median)是它所在集合的“中点元素”.当n为奇数时,中位数是唯一的:当n

输油管道问题

问题描述:  某石油公司计划建造一条由东向西的主输油管道.该管道要穿过一个有 n 口油井的油田.从每口油井都要有一条输油管道沿最短路经(或南或北)与主 管道相连.如果给定 n 口油井的位置,即它们的 x 坐标(东西向)和 y 坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置? 证明可在线性时间内确定主管道的最优位置. 给定 n 口油井的位置, 计算各油井到主管道之间的输油管道最小长度总和. 输入的第 1 行是油井数 n,1<=n<=10000.接下

线性时间选择算法

在一个由 n 个元素组成的集合中,第 i 个顺序统计量(order statistic)是该集合中第 i 小的元素.也就是说,最小值是第 1 个顺序统计量(i = 1),最大值是第 n 个顺序统计量(i = n). 中位数(median)是它所在集合的中点元素.当 n 为奇数时,中位数是唯一的,出现在 i = (n + 1)/2 处.当 n 为偶数时,存在两个中位数,下中位数 i = n/2 和上中位数 i = n/2 + 1 处.因此,不考虑 n 的奇偶性,中位数总是出现在 i = (n+1)