题目:

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

请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n))

类比一个数组的中位数,求两个数组的中位数就相当于把两个数组合并后的一个数组的中位数,例

输入: num1=[1,3,5]  num2=[2,4,6]

输出:(3+4)/2=3.5

方法:二分+递归

思路:

--看到有序,并且明确要求时间复杂度为log级的,肯定需要二分。但是请注意,很多人一看到二分,就想也不想的开始对数组进行二分,但是对于这题,对数组二分就进了死胡同了。这题是对另一个量进行二分。

--再分析中位数的特征,就是求数组中的某一个(或两个)数,其左右两边的个数相等

--设两个有序数组分别为,a,长度m;b,长度n

--那么这个中位数,就是,a和b合并后的第(m+n+1)/2个(先不管有2个中位数的情况,后面会有个小技巧来屏蔽奇偶差异)

--那么现在的问题就变成了,求两个有序数组中,从小到大的第k个值

--所以二分其实是对k进行二分,两个数组同时从0开始,每次往后跳k/2个,当然不是同时跳,谁更小才能跳,保证已经跳过的数在整个数组中是最小的

NO BB,上代码,先写求第k个值的方法

private int findKth(int[] array1, int start1, int end1, int[] array2, int start2, int end2, int k){if(start1>end1){return array2[start2+k-1];}if(start2>end2){return array1[start1+k-1];}if(k==1){return Math.min(array1[start1], array2[start2]);}int mid1=Integer.MAX_VALUE;int mid2=Integer.MAX_VALUE;//这里的思想,其实不是每次移动整个end-start的一半,而是移动k的一半if(start1+k/2-1<=end1){mid1=array1[start1+k/2-1];}if(start2+k/2-1<=end2){mid2=array2[start2+k/2-1];}if(mid1<mid2){return findKth(array1, start1+k/2, end1, array2, start2, end2, k-k/2);}return findKth(array1, start1, end1, array2, start2+k/2, end2, k-k/2);
}

再写求中位数的方法

public double findMiddle(int[] array1, int[] array2){int totalLength=array1.length+array2.length;if(totalLength==0){return -1;}//屏蔽奇偶差异,当是奇数时,k1,k2找到的是同一个中位数;当是偶数时,k1,k2找到的是两个中位数int k1=(totalLength+1)/2;int k2=(totalLength+2)/2;int mid1, mid2;if(array1.length==0){mid1=array2[k1-1];mid2=array2[k2-1];}else if(array2.length==0){mid1=array1[k1-1];mid2=array1[k2-1];}else {mid1=findKth(array1, 0, array1.length-1, array2, 0, array2.length-1, k1);mid2=findKth(array1, 0, array1.length-1, array2, 0, array2.length-1, k2);}return (double) (mid1+mid2)/2;}

计算两个有序数组的中位数相关推荐

  1. 计算两个有序数组的中位数(C++)

    题目描述: 计算两个有序数组的中位数,至少一个数组不为空.要求时间复杂度O(log(m+n)),m.n分别为两个数组的长度. 如: {1,2} {3} 输出应为2 {1,3} {2,5} 输出应为2. ...

  2. 数组越界怎么判断_算法连载之求解两个有序数组的中位数

    问题 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.找出这两个有序数组的中位数.假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] num ...

  3. return两个返回值_LeetCode 第四题 寻找两个有序数组的中位数

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

  4. 20191016:(leetcode习题)寻找两个有序数组的中位数

    寻找两个有序数组的中位数 题目 大致思路 代码实现 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log( ...

  5. python 找到两个排序数组的中位数_4. 寻找两个有序数组的中位数(Python)

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

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

      之前讲解过一道数据流求中位数的题目,但是仔细一想觉得那一次对几种数据结构简单的分析了一下实现,并没有对中位数的题目做一个凝练总结,这一次借这个机会,好好整理一下思路. 题目描述   给定两个大小为 ...

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

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

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

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

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

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

最新文章

  1. STM32 基础系列教程 2 - GPIO 按键输入
  2. mac 下载python库,Mac电脑安装python第三方库(就于python3)
  3. HTML/CSS常用标签属性及样式
  4. swoole mysql 连接池_基于Swoole的通用连接池 - 数据库连接池
  5. [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation
  6. LeetCode刷题(37)--Edit Distance
  7. 软件产品测试报告模板
  8. 【目标检测 论文泛读】Fast R-CNN (一张表格对比 R-CNN SPP FRCN)
  9. 【QT】通过QT_QPA_EGLFS_KMS_CONFIG宏来解决arm32环境下QT界面设置为透明却黑屏的问题
  10. Mac中如何卸载pkg包
  11. 个性化网站建设的一般流程
  12. 神奇的e——Python编程算e
  13. 你的导师对你说过什么让你至今难以忘怀的话?
  14. 【Day4.1】打的士去卧佛寺
  15. npm删除项目所有依赖和清缓存清缓存的办法
  16. 前端规范 - 前端项目开发规范
  17. GYM 100827 I.Salary Inequity(线段树)
  18. 金蝶EAS管理控制台一闪而过
  19. jvm_2_新生代老生代含义
  20. java实现从http/https链接地址下载文件

热门文章

  1. 如何移除FB的信用卡支付方式?
  2. 电脑xm音乐格式转mp3
  3. 给IT销售人员一点经验
  4. 使用el-date-picker渲染报错
  5. 华为IPsec IKE自动协商配置
  6. golang中defer和recover的使用
  7. caffe训练模型微调(fune tuning)
  8. mysql查看当前表字符集_查看mysql字符集及修改表字符集
  9. Unix 下压缩和解压缩命令
  10. 线上销售占比50%、88销售额暴增500%,沃尔玛是怎么变身的?