题目描述:

  给定两个有序数组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大值相关推荐

  1. HDU 2639(01背包求第K大值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2639 Bone Collector II Time Limit: 5000/2000 MS (Jav ...

  2. hdu 2665(主席树查询区间k大值)

    先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...

  3. 找出数组中前K大的值

    将数组划分为两部分,前K项为前K大值的集合,无需有序. while(true) {int flag = nums[k];while(i < k && nums[i] >= ...

  4. 利用划分树求解整数区间内第K大的值

    如何快速求出(在log2n的时间复杂度内)整数区间[x,y]中第k大的值(x<=k<=y)? 其实我刚开始想的是用快排来查找,但是其实这样是不行的,因为会破坏原序列,就算另外一个数组来存储 ...

  5. ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】

    瑶瑶的第K大 Time Limit:2000MS     Memory Limit:128000KB     64bit IO Format:%lld & %llu Submit Status ...

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

  7. java 寻找数组中第k大的值

    转载请注明来自:黄朝辉的博客 0.前言 在未排序的数组中查找第k大的数.这里不对k的值进行判断了,认为它是合法的. 1.排序 public static int findKthLargest(int[ ...

  8. C++的STL 堆 实现获取数组堆第K大的数

    前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 回到文章 ...

  9. 算法设计--查找无序数组中第K大的数字

    给出一个数组,要求查找出这个数组中按顺序排第K大的数字. 思路:利用快速排序的思想,把数组中的元素分治,并计算中间值的位置,如果是K,则这个数就是第K大的数字,如果比K小,那么再次利用快速排序分治中值 ...

  10. 两个有序数组的中位数(第k大的数)

    问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 感觉这种题目挺难的,尤其是将算法完全写对.因为当初自己微软面试的时候遇到了,但是没有想出来思路. ...

最新文章

  1. flask基础(上篇)
  2. opencv python cv2.imdecode()函数报错 :TypeError: Expected cv::UMat for argument 'buf'
  3. 如何使用JavaScript开发AR(增强现实)移动应用 (一)
  4. Java中的Google协议缓冲区
  5. 统计MySQL中某数据库硬盘占用量大小
  6. Stream Part.7
  7. MATLAB代码: 合并两张图
  8. 关于用Java写的贪吃蛇游戏的一些感想
  9. 使用win10 hyper-v安装linux系统
  10. pg注释某一段语句不执行_@Autowired的使用:推荐对构造函数进行注释
  11. KindEditor - 代码高亮
  12. 1988-2020年各省、分城乡基尼系数、基尼系数计算及相关经典文献、1978-2019年中国省市恩格尔系数表、泰尔指数计算模板、208个地级市和31个省、市城乡泰尔指数
  13. 从0开发《工程测绘大师》小程序之6°带中央子午线计算篇(八)
  14. Python 实现微信自动通过好友添加请求!!!
  15. 解决esp8266无法连接手机和电脑热点的问题
  16. 分享几个不错的流程图制作网站
  17. NamingContainer取得 GridView的列数(RowIndex)、对应的资料表 这一列的主索引键
  18. 每日一道算法题 拿金币(蓝桥杯练习系统)简单的dp算法
  19. 构造和析构:construct,destory
  20. PS多边形套锁工具在框选区的时候一按shift键PS

热门文章

  1. 前台实现ajax 需注意的地方
  2. 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第一章1-1.Fragment...
  3. 类序列化之后保存在COOKIES里
  4. bzoj 4052: [Cerc2013]Magical GCD
  5. 利用纯粹的CSS3替代小图标---向右箭头
  6. 我们聊聊快排吧...
  7. Apache-一个IP多个主机域名
  8. 在 MAC下安装 Exuberant ctags
  9. 如何开发和维能hold住全场的软件
  10. python 【递归 及 二分法】