3-5-多数组k大值
题目描述:
给定两个有序数组arr1和arr2,在给定一个整数k,返回两个数组的所有数中第K小的数。
例如:
arr1 = {1,2,3,4,5};
arr2 = {3,4,5};
K = 1;
因为1为所有数中最小的,所以返回1;
arr1 = {1,2,3};
arr2 = {3,4,5,6};
K = 4;
因为3为所有数中第4小的数,所以返回3;
要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M,N}))。
1 /* 2 思路:利用上一题NowClass3-4-GetUpMedian的求上中位数的思路进行求解。 3 arr1和arr2,其中数组长度分别为:lenS和lenL(lenS<=lenL) 4 分情况分析: 5 1) kth <= lenS; 6 只需求arr1和arr2的前kth个数的上中位数即可。 7 即:findProcess(arr1, 0, kth-1, arr2, 0, kth-1). 8 2) kth > lenL; 9 arr1中前kth-lenL-1个数不可能是第kth个数, 10 arr2中前kth-lenS-1个数不可能是第kth个数, 11 此时,arr1中剩余(lenS-(kth-lenL-1))=lenS+lenL+1-kth个可能的数, 12 arr2中剩余(lenL-(kth-lenS-1))=lenL+lenS+1-kth个可能的数。剩余个数相同。 13 然后,先判断arr1中的第kth-lenL-1个数是否大于arr2的最后一个数, 14 如果是则直接返回arr1的第kth-lenL-1个数即可。 15 再判断arr2中的第kth-lenS-1个数是否大于arr1的最后一个数, 16 如果是则直接返回arr2的第kth-lenS-1个数。 17 否则求arr1的(kth-lenS,lenS)和arr2的(kth-lenL,lenL)的上中位数。 18 即:findProcess(arr1,kth-lenS,lenS,arr2,kth-lenL,lenL). 19 3) lenS < kth <= lenL; 20 arr1中lenS个数都有可能, 21 arr2中(0, kth-1-lenS-1)和(kth-1,lenL-1)不可能,此时剩余kth-1-(kth-1-lenS-1)=lenS+1个数 22 然后,单独对地kth-lenS-1验证,是否大于arr1的最后一个数,如果是则直接返回该数; 23 否则,求arr1的(0,lenS-1)和arr2的(kth-lenS,kth-1)个数求上中位数。 24 即:findProcess(arr1,0,lenS-1,arr2, kth-lenS, kth-1). 25 */ 26 27 #include <iostream> 28 #include <vector> 29 using namespace std; 30 31 // 查找两个数组的上中位数。 32 int findProcess(vector<int> arr1, int l1, int r1, vector<int> arr2, int l2, int r2){ 33 if (l1 == r1) 34 return (arr1[l1] < arr2[l2] ? arr1[l1] : arr2[l2]); 35 // 元素个数为奇数,则offset=0;否则offset=1. 36 int offset = ((r1-l1+1)&1) ^ 1; 37 int mid1 = (l1+r1)/2; 38 int mid2 = (l2+r2)/2; 39 if (arr1[mid1] > arr2[mid2]) 40 return findProcess(arr1, l1, mid1, arr2, mid2+offset, r2); 41 else if(arr1[mid1] < arr2[mid2]) 42 return findProcess(arr1, mid1+offset, r1, arr2, l2, mid2); 43 else 44 return arr1[mid1]; 45 } 46 47 int findKthNum(vector<int> arr1, vector<int> arr2, int kth){ 48 if (kth <= 0 || kth > arr1.size()+arr2.size()) 49 exit(-1); 50 vector<int> arrS = arr1.size() < arr2.size() ? arr1 : arr2; 51 vector<int> arrL = arr1.size() < arr2.size() ? arr2 : arr1; 52 int lenS = arrS.size(); 53 int lenL = arrL.size(); 54 if (kth <= lenS) 55 return findProcess(arrS, 0, kth-1, arrL, 0, kth-1); 56 else if (kth > lenL){ 57 if (arrS[kth-lenL-1] >= arrL[lenL-1]) 58 return arrS[kth-lenL-1]; 59 else if (arrL[kth-lenS-1] >= arrS[lenS-1]) 60 return arrL[kth-lenS-1]; 61 else 62 return findProcess(arrS, kth-lenL, lenS-1, arrL, kth-lenS, lenL-1); 63 } 64 else{ 65 if (arrL[kth-lenS-1] >= arrS[lenS-1]) 66 return arrL[kth-lenS-1]; 67 else 68 return findProcess(arrS,0,lenS-1,arrL, kth-lenS, kth-1); 69 } 70 } 71 72 int main(){ 73 vector<int> a1; 74 a1.push_back(1); 75 a1.push_back(1); 76 a1.push_back(1); 77 a1.push_back(2); 78 a1.push_back(3); 79 a1.push_back(4); 80 81 a1.push_back(6); 82 a1.push_back(6); 83 a1.push_back(6); 84 85 a1.push_back(8); 86 a1.push_back(8); 87 a1.push_back(8); 88 89 a1.push_back(10); 90 a1.push_back(10); 91 a1.push_back(10); 92 a1.push_back(11); 93 a1.push_back(12); 94 a1.push_back(18); 95 a1.push_back(19); 96 97 vector<int> a2; 98 a2.push_back(11); 99 a2.push_back(19); 100 a2.push_back(21); 101 a2.push_back(33); 102 a2.push_back(42); 103 a2.push_back(50); 104 a2.push_back(50); 105 cout << findKthNum(a1,a2,19) << endl; 106 return 0; 107 }
转载于:https://www.cnblogs.com/qianmacao/p/4884806.html
3-5-多数组k大值相关推荐
- HDU 2639(01背包求第K大值)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2639 Bone Collector II Time Limit: 5000/2000 MS (Jav ...
- hdu 2665(主席树查询区间k大值)
先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...
- 找出数组中前K大的值
将数组划分为两部分,前K项为前K大值的集合,无需有序. while(true) {int flag = nums[k];while(i < k && nums[i] >= ...
- 利用划分树求解整数区间内第K大的值
如何快速求出(在log2n的时间复杂度内)整数区间[x,y]中第k大的值(x<=k<=y)? 其实我刚开始想的是用快排来查找,但是其实这样是不行的,因为会破坏原序列,就算另外一个数组来存储 ...
- ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】
瑶瑶的第K大 Time Limit:2000MS Memory Limit:128000KB 64bit IO Format:%lld & %llu Submit Status ...
- C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...
- java 寻找数组中第k大的值
转载请注明来自:黄朝辉的博客 0.前言 在未排序的数组中查找第k大的数.这里不对k的值进行判断了,认为它是合法的. 1.排序 public static int findKthLargest(int[ ...
- C++的STL 堆 实现获取数组堆第K大的数
前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 回到文章 ...
- 算法设计--查找无序数组中第K大的数字
给出一个数组,要求查找出这个数组中按顺序排第K大的数字. 思路:利用快速排序的思想,把数组中的元素分治,并计算中间值的位置,如果是K,则这个数就是第K大的数字,如果比K小,那么再次利用快速排序分治中值 ...
- 两个有序数组的中位数(第k大的数)
问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 感觉这种题目挺难的,尤其是将算法完全写对.因为当初自己微软面试的时候遇到了,但是没有想出来思路. ...
最新文章
- flask基础(上篇)
- opencv python cv2.imdecode()函数报错 :TypeError: Expected cv::UMat for argument 'buf'
- 如何使用JavaScript开发AR(增强现实)移动应用 (一)
- Java中的Google协议缓冲区
- 统计MySQL中某数据库硬盘占用量大小
- Stream Part.7
- MATLAB代码: 合并两张图
- 关于用Java写的贪吃蛇游戏的一些感想
- 使用win10 hyper-v安装linux系统
- pg注释某一段语句不执行_@Autowired的使用:推荐对构造函数进行注释
- KindEditor - 代码高亮
- 1988-2020年各省、分城乡基尼系数、基尼系数计算及相关经典文献、1978-2019年中国省市恩格尔系数表、泰尔指数计算模板、208个地级市和31个省、市城乡泰尔指数
- 从0开发《工程测绘大师》小程序之6°带中央子午线计算篇(八)
- Python 实现微信自动通过好友添加请求!!!
- 解决esp8266无法连接手机和电脑热点的问题
- 分享几个不错的流程图制作网站
- NamingContainer取得 GridView的列数(RowIndex)、对应的资料表 这一列的主索引键
- 每日一道算法题 拿金币(蓝桥杯练习系统)简单的dp算法
- 构造和析构:construct,destory
- PS多边形套锁工具在框选区的时候一按shift键PS
热门文章
- 前台实现ajax 需注意的地方
- 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第一章1-1.Fragment...
- 类序列化之后保存在COOKIES里
- bzoj 4052: [Cerc2013]Magical GCD
- 利用纯粹的CSS3替代小图标---向右箭头
- 我们聊聊快排吧...
- Apache-一个IP多个主机域名
- 在 MAC下安装 Exuberant ctags
- 如何开发和维能hold住全场的软件
- python 【递归 及 二分法】