问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4005 访问。

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 

请找出这两个有序数组的中位数。要求算法的时间复杂度为 

你可以假设 nums1 和 nums2 不同时为空。

nums1 = [1, 3]

nums2 = [2]

中位数是 2.0

nums1 = [1, 2]

nums2 = [3, 4]

中位数是 (2 + 3)/2 = 2.5

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

You may assume nums1 and nums2 cannot be both empty.

nums1 = [1, 3]

nums2 = [2]

The median is 2.0

nums1 = [1, 2]

nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。

对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。

这道题经过简单的思维转换其实可以转换成求第k小的值问题,首先合并2个数组,再找出第k小的值。该题需要根据原问题规模(m+n)的奇偶性做出相应调整。


示例

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4005 访问。

public class Program {

    public static void Main(string[] args) {
int[] nums1 = { 1, 2, 3 };
int[] nums2 = { 4, 5 }; var res = FindMedianSortedArrays(nums1, nums2); Console.WriteLine($"The median is {res}."); Console.ReadKey();
} private static double FindMedianSortedArrays(int[] nums1, int[] nums2) {
int size = nums1.Length + nums2.Length; int[] union = new int[size]; int mid = size / 2;
int even = (size % 2 == 0) ? 1 : 0; int m1, m2;
int left, right; for(int i = m1 = m2 = 0; i < size; i++) {
left = m1 < nums1.Length ? nums1[m1] : int.MaxValue;
right = m2 < nums2.Length ? nums2[m2] : int.MaxValue; if(left < right) {
union[m1 + m2] = nums1[m1];
m1++;
} else {
union[m1 + m2] = nums2[m2];
m2++;
} if(i == mid) break;
}
return (union[mid] + union[mid - even]) / 2.0;
} }

以上给出1种算法实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4005 访问。

The median is 3.

分析:

显然这种解法在最坏的情况下的时间复杂度为  ,并没有达到题中要求的  ,这里仅为标记,稍后再来改进算法。

最新文章

  1. phpcms 服务器安全认证错误
  2. windows上JSP开发环境全搭建
  3. 百度地图API示例之添加自定义控件
  4. 【转】android onNewIntent()触发机制及注意事项
  5. 问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
  6. webserver&lt;2&gt;
  7. 什么是VPN?
  8. 编译@Override报错
  9. HDU_2044——蜜蜂走蜂房,递推
  10. strdup函数的使用方法
  11. 基于Visual C++2013拆解世界五百强面试题--题12-进制转换
  12. 你有没有忽略TextField的leftView这个属性
  13. [国嵌攻略][061][2440LCD驱动设计]
  14. 201621123031 《Java程序设计》第5周学习总结
  15. docker 5 docker-阿里云加速配置
  16. windows上xshell6的安装
  17. 阻止新的csproj工程的dll引用继承
  18. ruby puts, print, p方法比较
  19. 关于COM组件log的位置
  20. linux文件锁flock【转】

热门文章

  1. Qt_IO系统_文件
  2. 【C#】根据开始时间和结束时间筛选存在的信息
  3. Springboot整合SpringSecurity--对静态文件进行权限管理
  4. C++语法小记---少见的语法之一
  5. xmake从入门到精通12:通过自定义脚本实现更灵活地配置
  6. Mybatis核心模块简介
  7. Ribbon负载均衡接口
  8. Jmeter性能测试使用指南
  9. Redis的各种数据类型到底能玩出什么花儿?
  10. scrapyd 部署