求第k个值

1.归并排序

归并到第k个值为止

时间复杂度:O(k)

  1. class Solution {
  2. public:
  3. // merge-sort to find K-th value
  4. double helper(vector<int> A, vector<int> B, int lenA, int lenB, int k) {
  5. int i = , j = ;
  6. while ((i < lenA) && (j < lenB)) {
  7. k--;
  8. if (A[i] < B[j]) {
  9. if ( == k) {
  10. return A[i];
  11. }
  12. ++i;
  13. } else if ( == k) {
  14. return B[j];
  15. } else {
  16. ++j;
  17. }
  18. }
  19. return (i >= lenA)?B[j + k - ]:A[i + k - ];
  20. }
  21. /**
  22. * @param A: An integer array.
  23. * @param B: An integer array.
  24. * @return: a double whose format is *.5 or *.0
  25. */
  26. double findMedianSortedArrays(vector<int> A, vector<int> B) {
  27. // write your code here
  28. int m = A.size();
  29. int n = B.size();
  30. return ((m + n) & )?
  31. (helper(A, B, m, n, (m + n + )>>)):
  32. (((helper(A, B, m, n, ((m + n)>>) + ))+(helper(A, B, m, n, (m + n)>>))) * .);
  33. }
  34. };

2. 分治法

利用归并的思想,从a和b中一共取k个数

假设len(a)<len(b)

从a中取pa = min(k/2, len(a))个元素;

从b中取pb = k-pa个元素;

如果a[pa - 1]<b[pb - 1],则归并排序时先归并a[pa - 1],说明a数组的数取“少”了,不够用

  a到终点后,只用b的数凑足了k个,这说明总的第k大的值不会出现在a[0...pa-1]里边,所以我们扔掉前pa个数

  对于b数组,说明总的第k大的数不会出现在b[pb...lenB]里边,pb后边的数就没用了

如果a[pa - 1]>=b[pb - 1],是对称情况

  归并排序时,会先归并b[pb - 1],说明b数组的数取“少”了,不够用

  b到终点后,只用a的数凑足了k个,这说明总的第k大的值不会出现在b[0...pb-1]里边,所以我们扔掉前pb个数

  对于a数组,说明第k大的数不会出现在a[pa...lenA]里边,pa的后边就没用了

总结:扔掉较小数组的前一部分,扔掉较大数组的后一部分

复杂度分析:O(logK), K每次几乎减少一半

  1. class Solution {
  2. public:
  3. // merge-sort to find K-th value
  4. double helper(int *A, int *B, int lenA, int lenB, int k) {
  5. if (lenA > lenB) {
  6. return helper(B, A, lenB, lenA, k);
  7. }
  8. // lenA <= lenB
  9. if (lenA == ) {
  10. return B[k - ];
  11. }
  12. if ( == k) {
  13. return min(A[], B[]);
  14. }
  15. int pa = min(lenA, k >> ), pb = k - pa;
  16. return (A[pa - ] < B[pb - ])?
  17. helper(A + pa, B, lenA - pa, lenB, k - pa):
  18. helper(A, B + pb, lenA, lenB - pb, k - pb);
  19. }
  20. /**
  21. * @param A: An integer array.
  22. * @param B: An integer array.
  23. * @return: a double whose format is *.5 or *.0
  24. */
  25. double findMedianSortedArrays(vector<int> A, vector<int> B) {
  26. // write your code here
  27. int m = A.size();
  28. int n = B.size();
  29. return ((m + n) & )?
  30. (helper(A.data(), B.data(), m, n, (m + n + )>>)):
  31. (((helper(A.data(), B.data(), m, n, ((m + n)>>) + ))+(helper(A.data(), B.data(), m, n, (m + n)>>))) * .);
  32. }
  33. };

LintCode: Median of two Sorted Arrays的更多相关文章

  1. [LintCode] Median of Two Sorted Arrays 两个有序数组的中位数

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  2. 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays

    一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...

  3. 2.Median of Two Sorted Arrays (两个排序数组的中位数)

    要求:Median of Two Sorted Arrays (求两个排序数组的中位数) 分析:1. 两个数组含有的数字总数为偶数或奇数两种情况.2. 有数组可能为空. 解决方法: 1.排序法 时间复 ...

  4. 【转载】两个排序数组的中位数 / 第K大元素(Median of Two Sorted Arrays)

    转自 http://blog.csdn.net/zxzxy1988/article/details/8587244 给定两个已经排序好的数组(可能为空),找到两者所有元素中第k大的元素.另外一种更加具 ...

  5. LeetCode 4 Median of Two Sorted Arrays (两个数组的mid值)

    题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...

  6. No.004 Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...

  7. leetcode第四题:Median of Two Sorted Arrays (java)

    Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...

  8. LeetCode(3) || Median of Two Sorted Arrays

    LeetCode(3) || Median of Two Sorted Arrays 题记 之前做了3题,感觉难度一般,没想到突然来了这道比较难的,星期六花了一天的时间才做完,可见以前基础太差了. 题 ...

  9. Kotlin实现LeetCode算法题之Median of Two Sorted Arrays

    题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...

随机推荐

  1. AngularJS动态设置CSS

    使用AngularJS动态设置CSS大致有2种思路: 1.通过动态设置class名称 比如先定义2个样式: .show-true{    display:block;} .show-flase{    ...

  2. Android:活动的启动模式

    启动模式一共有四种,分别是 standard .singleTop . singleTask 和 singleInstance , 可 以 在 AndroidManifest.xml 中 通 过 给 ...

  3. java中Double类数字太大时页面正常显示而不要用科学计数法

    /** * 当浮点型数据位数超过10位之后,数据变成科学计数法显示.用此方法可以使其正常显示. * @param value * @return Sting */ public static Stri ...

  4. .NET:枚举的默认值

    .NET中的值类型默认都会设置为0,枚举也是如此,因此当你定义自己的枚举值类型且显式的指定了枚举值时,别忘记使用0,如果由于某种原因不能使用0,如使用了Flag标记,则别忘记在使用了枚举类型的构造方法 ...

  5. MQ:Introducing Advanced Messaging

    原文地址:http://www.yourenterprisearchitect.com/2011/11/introducing-advanced-messaging.html. Introducing ...

  6. bean validation 技术规范

    Bean Validation 技术规范特性概述 张 冠楠 和 陈 志娴2011 年 3 月 24 日发布 WeiboGoogle+用电子邮件发送本页面 2 概述 Bean Validation 规范 ...

  7. endnote插入参考文献后的对齐方式和缩进空格

    原文链接 https://jingyan.baidu.com/article/63acb44a3f0f6161fcc17ed0.html 1 2 3 4 5 6 7 分步阅读 1.endnote 导入 ...

  8. anaconda里面安装tensorflow

    这篇文章讲的比较好: https://blog.csdn.net/evaljy/article/details/70209957 用这篇文章的内容,能够安装成功

  9. GIS原理学习目录

    GIS原理学习目录 内容提要 本网络教程是教育部“新世纪网络课程建设工程”的实施课程.系统扼要地阐述地理信息系统的技术体系,重点突出地理信息系统的基本技术及方法. 本网络教程共分八章:第一章绪论,重点 ...

  10. 关掉Windows Firewall的PowerShell

    在Windows 8或Windows 2012 R2上, 使用下面的命令: Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled ...