博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(算法)两个有序数组的第k大的数
阅读量:5941 次
发布时间:2019-06-19

本文共 2049 字,大约阅读时间需要 6 分钟。

题目:

有两个数组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
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==1){ if(A[aLeft]>B[bLeft]) return B[bLeft]; else return A[aLeft]; } int aKth=aLeft+(k>>1)-1; int bKth=bLeft+(k>>1)-1; if(A[aKth]
>1)); else return FindKthElem_1(A,aLeft,aRight,B,bKth+1,bRight,(k>>1));}// if length of A + length of B >=kint FindKthElem_2(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]; int aMid=aLeft+((aRight-aLeft)>>1); int bMid=bLeft+((bRight-bLeft)>>1); int halfLen=aMid-aLeft+bMid-bLeft+2; if(A[aMid]
k){ return FindKthElem_2(A,aLeft,aRight,B,bLeft,bMid-1,k); } else{ return FindKthElem_2(A,aMid+1,aRight,B,bLeft,bRight,k-(aMid-aLeft+1)); } } else{ if(halfLen>k){ return FindKthElem_2(A,aLeft,aMid-1,B,bLeft,bRight,k); } else{ return FindKthElem_2(A,aLeft,aRight,B,bMid+1,bRight,k-(bMid-bLeft+1)); } }}int main(){ int A[]={
1,2,3,7,8,9}; int B[]={
4,5,6,10,11,12}; int aLen=sizeof(A)/sizeof(A[0]); int bLen=sizeof(B)/sizeof(B[0]); int k; while(true){ cout<<"Please Input k:"<
>k; cout<< FindKthElem_1(A,0,aLen-1,B,0,bLen-1,k) <

转载地址:http://rjmtx.baihongyu.com/

你可能感兴趣的文章
F# 2017回顾
查看>>
中台之上(十一):企业级业务架构设计的“五难”
查看>>
从前后端分离到GraphQL,携程如何用Node实现?\n
查看>>
JavaScript标准库系列——RegExp对象(三)
查看>>
微软宣布在Azure API管理中预览OpenAPI规范V3
查看>>
Delphi、C#之父Anders Hejlsberg首次访华 推广TypeScript
查看>>
package中的常用script命令
查看>>
物联网技术周报第 145 期: ESP8266 和 IFTTT 自制 WiFi 智能秤
查看>>
6. 管理你的css和js文件 - 从零开始学Laravel
查看>>
推进"五通一平":手淘技术核心"三大容器 五大方案"首次整体亮相 百川开放全面升级...
查看>>
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
Yii2多模型与事务的用法
查看>>
js深度解析url地址
查看>>
JQuery插件:ScrollTo平滑滚动到页面指定位置
查看>>
web入门+书籍推荐
查看>>
[转]:xmake插件开发之色彩高亮显示
查看>>
OS X 下在代码中枚举所有进程的方法
查看>>
【推荐】R for Data Science 新书抢先看
查看>>
maven scala plugin 实现jvmArgs,执行过程原理解析笔记
查看>>
eventEmitter3源码分析与学习
查看>>