(算法)两个有序数组的第k大的数
题目:
有两个数组A和B,假设A和B已经有序(从大到小),求A和B数组中所有数的第K大。
思路:
1、如果k为2的次幂,且A,B 的大小都大于k,那么
考虑A的前k/2个数和B的前k/2个数,
如果A[k/2]<B[k/2],说明A的前k/2个数一定在A和B总的前k个数中,因此只需要在A的k/2之后的数和B中查找第k/2大的数;
否则,说明A的前k/2个数一定在A和B总的前k个数中,因此只需要在B的k/2之后的数和A中查找第k/2大的数;
递归实现即可;
2、如果A+B的数组大小大于k
二分法,考虑A的前一半m/2和B的前一半n/2,
假设A[mid]<B[mid]:
如果m/2+n/2大于k,则表明第k大存在于A和B的前一半中;否则,只需在A的m/2之后的数和B中找第k-m/2大的数;
假设A[mid]>B[mid]:
如果m/2+n/2大于k,则表明k存在于A和B的前一半中;否则,只需在B的n/2之后的数和A中找第k-n/2大的数;
递归实现即可;
代码:
#include<iostream> using namespace std; // if length of A && length of B >=k
// k is power of 2
int FindKthElem_1(int A[],int aLeft,int aRight,int B[],int bLeft,int bRight,int k){
/*
if(aLeft>aRight)
return B[bLeft+k-1];
if(bLeft>bRight)
return A[aLeft+k-1];
*/
if(k==){
if(A[aLeft]>B[bLeft])
return B[bLeft];
else
return A[aLeft];
} int aKth=aLeft+(k>>)-;
int bKth=bLeft+(k>>)-; if(A[aKth]<B[bKth])
return FindKthElem_1(A,aKth+,aRight,B,bLeft,bRight,(k>>));
else
return FindKthElem_1(A,aLeft,aRight,B,bKth+,bRight,(k>>));
} // if length of A + length of B >=k
int FindKthElem_2(int A[],int aLeft,int aRight,int B[],int bLeft,int bRight,int k){
if(aLeft>aRight)
return B[bLeft+k-];
if(bLeft>bRight)
return A[aLeft+k-]; int aMid=aLeft+((aRight-aLeft)>>);
int bMid=bLeft+((bRight-bLeft)>>); int halfLen=aMid-aLeft+bMid-bLeft+; if(A[aMid]<B[bMid]){
if(halfLen>k){
return FindKthElem_2(A,aLeft,aRight,B,bLeft,bMid-,k);
}
else{
return FindKthElem_2(A,aMid+,aRight,B,bLeft,bRight,k-(aMid-aLeft+));
}
}
else{
if(halfLen>k){
return FindKthElem_2(A,aLeft,aMid-,B,bLeft,bRight,k);
}
else{
return FindKthElem_2(A,aLeft,aRight,B,bMid+,bRight,k-(bMid-bLeft+));
}
}
} int main(){
int A[]={,,,,,};
int B[]={,,,,,}; int aLen=sizeof(A)/sizeof(A[]);
int bLen=sizeof(B)/sizeof(B[]); int k;
while(true){
cout<<"Please Input k:"<<endl;
cin>>k;
cout<< FindKthElem_1(A,,aLen-,B,,bLen-,k) <<endl;
cout<< FindKthElem_2(A,,aLen-,B,,bLen-,k) <<endl;
}
return ;
}
(算法)两个有序数组的第k大的数的更多相关文章
- 【medium】4. Median of Two Sorted Arrays 两个有序数组中第k小的数
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- 4. Median of Two Sorted Arrays *HARD* -- 查找两个排序数组的中位数(寻找两个排序数组中第k大的数)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- [经典算法题]寻找数组中第K大的数的方法总结
[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...
- 查找数组中第k大的数
问题: 查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...
- 无序数组求第K大的数
问题描述 无序数组求第K大的数,其中K从1开始算. 例如:[0,3,1,8,5,2]这个数组,第2大的数是5 OJ可参考:LeetCode_0215_KthLargestElementInAnArra ...
- 【递归打卡2】求两个有序数组的第K小数
[题目] 给定两个有序数组arr1和arr2,已知两个数组的长度分别为 m1 和 m2,求两个数组中的第 K 小数.要求时间复杂度O(log(m1 + m2)). [举例] 例如 arr1 = [1, ...
- 每天一道算法题目(18)——取等长有序数组的上中位数和不等长有序数组的第k小的数
1.取上中位数 题目: 给定两个有序数组arr1和arr2,两个数组长度都为N,求两个数组中所有数的上中位数.要求:时间复杂度O(logN). 例如: arr1 = {1, ...
- 算法题之找出数组里第K大的数
问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...
- 每天一道算法题(32)——输出数组中第k小的数
1.题目 快速输出第K小的数 2.思路 使用快速排序的思想,递归求解.若键值位置i与k相等,返回.若大于k,则在[start,i-1]中寻找第k大的数.若小于k.则在[i+1,end]中寻找第k+st ...
随机推荐
- 2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)
贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问.他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色.为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于 ...
- DeveloperAppleHelp
UIKit: 1.UIKit User Interface Catalog 视图 View控件 2.View Programming Guide for iOS 视图编程,用代码 构建界面. 3. ...
- C++各大名库
C++各大名库的介绍之C++标准库 标准库中提供了C++程序的基本设施.虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实 ...
- no device found for connection ‘ System eth0′
解决办法: 1.删除/etc/udev/rules.d/70-persistent-net.rules文件,重启系统. 2.如果上面的不起作用,那么去看ifcfg-eth0文件中的HWADDR是否正确 ...
- addEventListener 的一些好方法 简单粗暴的说给你
function show(){ document.addEventListener("click",fn,{ "passive":false, "c ...
- ThinkPHP通过类的链式继承优化空操作的实现
上篇<ThinkPHP空操作和空控制器的处理>中,在处理空操作时修改了父类Controller.class.php中代码,不到万不得已不能 修改基类控制器中的原码,此时可在子类与父类之间, ...
- ASP.NET WEB API 调试
ASP.NET WEB API 中的路由调试与执行过程跟踪 http://www.cnblogs.com/Irving/p/4305493.html 路由调试 RouteDebugger 是调试 AS ...
- 关于Hyper-V备份的四大注意事项
尽管Hyper-V备份相对简单,但备份管理员仍需注意四大问题.这四方面的问题在创建备份时可能不太重要,但在备份恢复时影响甚大. 1.对于虚拟机来说不仅意味着虚拟磁盘 就目前来看,企业在执行Hyper- ...
- Spring3数据库事务管理机制
Spring对事务的解决办法其实分为2种:编程式实现事务,AOP配置声明式解决方案. http://jinnianshilongnian.iteye.com/blog/1496953 Spring提供 ...
- [runtime] iOS-Runtime-Headers
Dynamically Generated iOS Headers https://github.com/nst/iOS-Runtime-Headers Here are iOS Objective- ...