(算法)两个有序数组的第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 ...
随机推荐
- 如何成为一名优秀的CTO(首席技术官)
最近我发现很多开发人员都表示不知道如何规划职业生涯的下一个步骤.基于我们目前所处的科技泡沫现象,很多工程师都倾向于留在大型的成熟公司,或者要么a)去初创企业工作要么b)自己搞初创公司. 回顾我自己的职 ...
- CSS实现背景透明,文字不透明
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- RTSP交互过程
步骤一: 发送:OPTIONS rtsp://127.0.0.1/172.30.31.225:8000:HIK-DS8000HC:0:1:admin:hs123456:av_stream RTSP/1 ...
- BitTorrent Sync 老版本
Sync version 1.4.111 Installer for Windows: BTSync.exe BTSync_x64.exe Installer for OSX: BTSync.dmgG ...
- php Function split() is deprecated 的解决办法
原文地址: http://www.cnblogs.com/mfryf/archive/2012/05/31/2527307.html php升级为5.3后,程序会报 Function split() ...
- python测试开发django-7.django模板继承(block和extends)
前言 打开一个网站时候,点导航栏切换到不同的页面,发现导航部分是不变的,只是页面的主体内容变了,于是就可以写个母模板,其它的子页面继承母模板就可以了. 母模板 可以在母模板中添加多个块标签,每个块标签 ...
- [cocos2dx笔记003] Vs2013添加静态库project
(基于2.2.2版本号.用vs2013编辑代码)(cppblog版本号:http://www.cppblog.com/zdhsoft/archive/2014/05/11/206890.html) 在 ...
- 关于JSONP以及跨域相关
什么是跨域: 浏览器对ajax请求的限制,不允许跨域请求资源. http://www.a.com--->http://www.b.com 是跨域 http://www.a.com-- ...
- Linux 提权常用命令集
转载:http://www.myhack58.com/Article/html/3/8/2017/83236.htm 0x00 操作系统相关 操作系统类型版本 cat /etc/issue cat / ...
- UIButton使用方法汇总
//按钮初始化类方法 UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];//这里创建一个圆角矩形的按钮 //按 ...