题目:

有两个数组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大的数的更多相关文章

  1. 【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 ...

  2. 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 ...

  3. [经典算法题]寻找数组中第K大的数的方法总结

    [经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...

  4. 查找数组中第k大的数

    问题:  查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...

  5. 无序数组求第K大的数

    问题描述 无序数组求第K大的数,其中K从1开始算. 例如:[0,3,1,8,5,2]这个数组,第2大的数是5 OJ可参考:LeetCode_0215_KthLargestElementInAnArra ...

  6. 【递归打卡2】求两个有序数组的第K小数

    [题目] 给定两个有序数组arr1和arr2,已知两个数组的长度分别为 m1 和 m2,求两个数组中的第 K 小数.要求时间复杂度O(log(m1 + m2)). [举例] 例如 arr1 = [1, ...

  7. 每天一道算法题目(18)——取等长有序数组的上中位数和不等长有序数组的第k小的数

    1.取上中位数 题目: 给定两个有序数组arr1和arr2,两个数组长度都为N,求两个数组中所有数的上中位数.要求:时间复杂度O(logN).      例如:          arr1 = {1, ...

  8. 算法题之找出数组里第K大的数

    问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...

  9. 每天一道算法题(32)——输出数组中第k小的数

    1.题目 快速输出第K小的数 2.思路 使用快速排序的思想,递归求解.若键值位置i与k相等,返回.若大于k,则在[start,i-1]中寻找第k大的数.若小于k.则在[i+1,end]中寻找第k+st ...

随机推荐

  1. 中国气象局某分院官网漏洞打包(弱口令+SQL注入+padding oracle)

    漏洞一.后台弱口令 后台地址:http://www.hnmatc.org/admin/ 直接爆破得到账号admin  密码admin888 漏洞二.SQL注入(前台后台都有) 注入点:http://w ...

  2. Android 打包出现jdk版本错误的问题

    Android 打包出现 jdk 版本错误的问题,本质上是 SDK 的问题,与 JDK 无关.如果 SDK 的 API 是24或者更高,就要求 jdk 1.8,我这里指定的 API 是22,所以去勾选 ...

  3. SQL Server中执行正则表达式

    总体方案:写function,再执行update语句. 一.查询函数 -- ============================================= -- Author: <l ...

  4. git中如何合并某个指定文件?

    分支A_bracn和B_branch,只想将A_branch分支的某个文件f.txt合并到B_branch分支上.git checkout A_branch      git checkout --p ...

  5. 一个.net下的轻量级的Serverless 文档数据库LiteDB

    今天发现了一个.net下的轻量级的Serverless 文档数据库LiteDB,感觉还不错 官方网站: http://www.litedb.org/ 项目主页: https://github.com/ ...

  6. 淘宝海量数据库之八-攻克随机IO难关 -----阿里正祥的博客

    http://blog.sina.com.cn/s/blog_3fc85e260100qwv8.html

  7. WaitForSingleObject和CEvent用法

    WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将 ...

  8. anroid源码下载和编译

    本文是在Ubuntu10.10系统上进行实践的. 1 因为我们需要Android的模拟器,所以需要安装Android的SDK,并创建AVD, 可以一次命名为AVD15,AVD22,AVD23,... ...

  9. Oracle WIHT AS 用法

    1.with table as 相当于建个临时表(用于一个语句中某些中间结果放在临时表空间的SQL语句),Oracle 9i 新增WITH语法,可以将查询中的子查询命名,放到SELECT语句的最前面. ...

  10. Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能

    我们的Glide系列文章终于要进入收尾篇了.从我开始写这个系列的第一篇文章时,我就知道这会是一个很长的系列,只是没有想到竟然会写这么久. 在前面的六篇文章中,我们对Glide的方方面面都进行了学习,包 ...