/*
两个有序数组求中位数问题;
这个题有很多方法:
方法一:排序,找到中位数;
方法二:归并排序的思想
方法三:转换成求第k小值  
*/

/*
思路:使用二分查找,时间复杂度为log(m+n). 该方法的核心是将原问题转变成
一个寻找第k小数的问题(假设两个原序列升序排列),
这样中位数实际上是第(m+n)/2小的数。所以只要解决了第k小数的 问题,
原问题也得以解决。首先假设数组A和B的元素个数都大于k/2,
我们比较A[k/2-1]和B[k/2-1]两个元素,这两个元素分别表示A的第k /2小的元素
和B的第k/2小的元素。这两个元素比较共有三种情况:>、<和=。
如果A[k/2-1]<B[k/2-1],这表示 A[0]到A[k/2-1]的元素都在A和B合并之后的前k小的元素中。
换句话说,A[k/2-1]不可能大于两数组合并之后的第k小值,所以我们可以将 其抛弃。
*/
#include<iostream>

using namespace std;

double findKth(int a[], int m, int b[], int n, int k)
{
if (m>n)
{
return findKth(b,n,a,m,k);
}

if (m==0)
{
return b[k-1];
}
if (k==1)
{
return min(a[0], b[0]);
}

int pa = min(k/2, m);
int pb = k - pa;
if (a[pa-1]<b[pb-1])
{
return findKth(a+pa, m-pa, b,  n, k-pa);
}
else if (a[pa-1]>b[pb-1])
{
return findKth(a, m, b+pb, n-pb, k-pb);
}
else
{
return a[pa-1];
}
}

class Solution
{
double findMedian(int A[], int m, int B[], int n)
{
int total = m + n;
if (total&0x1)
{
return findKth(A, m, B, n, total/2+1);
}
else
{
return (findKth(A, m, B, n, total / 2) + findKth(A,m,B,n,total/2+1))/2;
}
}
};

【两个有序数组求中位数】相关推荐

  1. Leetcode算法题:两个有序数组求中位数

    Leetcode算法题:两个有序数组求中位数 要求时间复杂度为O(log(m+n)) 思路: 暴力解决:合并数组并排序,简单且一定能实现,时间复杂度O(m+n) 由于两个数组已经排好序,可一边排序一边 ...

  2. 两个有序数组求中位数的三种解法

    寻找两个有序数组的中位数(附上三种解法)_BoCong-Deng的博客-CSDN博客_两个有序数组求中位数

  3. 两个有序数组求中位数log(m+n)复杂度

    leetcode 第4题 中位数技巧: 对于长度为L的有序数组,它的中位数是(a[ceil((L+1)/2)]+a[floor((L+1)/2)])/2 算法原理: 类似三分法求极值 两个人都前进,谁 ...

  4. 算法题:两个有序数组求中位数

    leetcode上遇到的一道题,感觉很有意思 因为要求O(log(m+n)),所以第一反应时用二分来找,但是该怎么用二分呢? 数组A,B分别有序,我们可以先找到数组A中的一条分界线i,使得数组A分为A ...

  5. 利用分治法求两个有序数组的中位数

    也是看了一篇很好的博客,思路很清晰,只是有些地方感觉博主没有详细解释,后来理解了,做了一个小总结.原博客链接:点击打开链接 题目还是昨天的那道题目: 给定两个大小为 m 和 n 的有序数组 nums1 ...

  6. LeetCode实战:寻找两个有序数组的中位数

    题目英文 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...

  7. 算法--------------------寻找两个有序数组的中位数

    题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假设 nums1 和 num ...

  8. 4. 寻找两个有序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2  ...

  9. leetcode 4. 寻找两个有序数组的中位数,c语言

    leetcode上第四道题,如下. 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假 ...

最新文章

  1. Ubuntu16.04 安装Qt
  2. 乔布斯的64周年诞辰,苹果滞销的第N天
  3. matlab求传递函数在某个频率点的增益_【干货分享】轻松弄懂开关电源TL431环路补偿传递函数推导...
  4. c# 单例 按需创建
  5. 反模式? 只有模式不彻底吧
  6. python计算向量夹角代码
  7. 探秘Java中String、StringBuilder以及StringBuffer
  8. sublime text2如何连接FTP/SFTP——图文详细教程
  9. android小闹钟课程设计,《小闹钟》教学设计
  10. Product文本格式说明
  11. 使用.Net Core编写命令行工具(CLI)
  12. gradle 安装_如何安装Gradle
  13. 在Spring中配置多个View解析器
  14. C# 中? 和 ?? 在变量中的使用
  15. (五)构建和训练深度伪造自动编码器
  16. .Net Core中对FluentEmail.Smtp进行封装使用
  17. oracle如何禁用索引,oracle 禁用索引
  18. 平衡树(模板+文艺平衡树)
  19. C语言:输出大写的三角形字母表(进阶)
  20. vsCode无法自动换行显示

热门文章

  1. 孩子缺乏学习动力的表现
  2. Freeswitch配置之sofia
  3. C# 表格导出txt格式制表符问题原因
  4. 人在外地如何拨打移动手机号归属地的客服?移动客服(10000 )
  5. 有序列表、无序列表、自定义列表
  6. Wein2K入门操作(1)
  7. Linux系统U盘操作格式化
  8. 不明原因儿童急性肝炎与新冠有关?!柳叶刀子刊最新研究激起千层浪
  9. 华为荣耀畅玩7c计算机在那,华为荣耀畅玩7c驱动
  10. mysql从当前日期获取工作日的命令_从MySQL中具有DATE记录的列获取每月的第N个工作日...