题目描述:

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

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

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

示例 1:

nums1 = [1, 3]
nums2 = [2]则中位数是 2.0

示例 2:

nums1 = [1, 2]
nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5

详细思路以及举例:(转载)

1、因为是两个有序数组,所以需要两个割点C1,C2。若将两个数组(都是升序排序的数组)分别在一个割点处分为两半,那么L1(数组前半部分的最右边的元素)一定是小于R1(数组后半部分最左边的元素),同理L2<R2。

因为要找两个有序数组的中位数(为了方便奇偶性的区分,我们将两个数组分别虚拟设置为奇数,所以两个数组看为一个数组的时候,元素个数为偶数,中位数=(m1+m2)/2,此时只要找到m1,m2中位数便可以求出),若割点刚好处于中间,此时只需要找到当L1<R2,L2<R1的时候(两个数组前半部分都保证了比后半部分小的时候),比较L1和L2的数值,找选出最大的(因为左半部分从左到右是依次增大,那么找出最靠近右边的那个数m1)。

同理当R1>L2,R2>L1时候,比较R1和R2的数值,找出最小的(因为右半部分从左到右依次增大,那么找出最靠近左边的那个数m2)。此时(m1+m2)/2便是要求的中位数。

2、首先一个数组要求中位数,必须是排序好,而且要分奇偶,才能求出中位数。现在是两个数组,奇偶性都在不确定,所以原博主很明智地将数组进行了处理,通过虚拟地加入#符号,使得数组恒为奇。(例如:1,2,48,90  虚拟加#符号后变为:#1#2#48#90#),此处的处理是通过公示:2n+1始终是奇数而来的。代码中并没有实际加入符号#,只是将数组的长度进行了2n+1的翻倍。

3、所以只要找到处于中间的那个割点K,并找到K左右的两个数值,就可以求出中位数。对于单个有序数组,K的位置就是在数组长度一半的位置(当然要分奇偶)。偶数的话就是K左右的两个数值相加除以2,奇数的话,也就是K所在的位置。那么对于两个有序数组的话,如果left1,left2(两个数组的左半部分)的元素个数相加等于K的时候,比较L1,L2找出最大的那个数值,那个数值就是K左边的值,同理,K右边的值就是R1,R2中最小的那个。若假设数组1的割点为C1,数组2的隔点为C2,那么当C1+C2 = K的时候,就可以进行比较。

4、比较的时候,如果L1 > R2的时候,就需要将C1往左移动(左边数值更小),将C2往右移动(右边数值更大),直到满足L1<R2.

同理,如果L2 > R1的时候,就需要将C2往左移动,C1往右边移动,直到满足L2<R1。

此处需要考虑越界的问题:

若当C1=0,移动到了最左边或者C2移动到了最右边,都还不满足L1 < R2的时候,说明数组1 > 数组2,此时中位数在数组2中,若当C2=0,移动到了最左边或者C1移动到了最右边,还不满足L2<R1的时候,说明数组1 < 数组2,此时中位数在数组1中。

5、假设数组1长度为n,数组2长度为m,并且n<m(从最小长度进行二分)。

将数组长度进行虚处理,然后再把两个数组看作是数组A。

此时长度为(2m+1)+(2n+1)=2m+2n+2 此时从最中间隔开,k = (2m+2n+2)/2=(m+n+1),因为数组A是从下标0开始计数的,所以在程序中K实际等于(m+n).知道K值之后,C1,C2任意知道其中一个,便可以确定另外一个,此处对长度较小的数组进行二分,所以确定C1后再确定C2, C2 = k-C1=m+n-C1.此时我们将数组进行了虚拟的加#,所以要确定原来数组元素的真正位置,就包含一个映射关系。L1 =(C1-1)/2   L2=(C2-1)/2  R1=(C1/2) R2=(C2/2)
--------------------- 
作者:Jialuhu 
来源:CSDN 
原文:https://blog.csdn.net/qq_36573828/article/details/80752575

代码如下:

class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int n = nums1.size();int m = nums2.size();if(n > m){return findMedianSortedArrays(nums2,nums1);}int L1,L2,R1,R2,c1,c2,lo = 0, hi = 2 * n;while(lo <= hi){c1 = (lo + hi)/2;  c2 = m + n- c1;L1 = (c1 == 0) ? INT_MIN:nums1[(c1-1)/2];   R1 = (c1 == 2*n) ? INT_MAX:nums1[c1/2];L2 = (c2 == 0) ? INT_MIN:nums2[(c2-1)/2];R2 = (c2 == 2*m) ? INT_MAX:nums2[c2/2];if(L1 > R2)hi = c1 - 1;else if(L2 > R1)lo = c1 + 1;elsebreak;}return (max(L1,L2)+ min(R1,R2))/2.0;}
};

码源:

--------------------- 
作者:Vosky 
来源:CSDN 
原文:https://blog.csdn.net/hk2291976/article/details/51107778 
版权声明:本文为博主原创文章,转载请附上博文链接!

LeetCode(C++):寻找两个有序数组的中位数相关推荐

  1. 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】

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

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

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

  3. LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)

    文章目录 1. 题目 2. 解题 2.1 合并数组 2.2 优化2.1解法,双指针 2.3 二分法(找第k个数) 2.4 切分法 1. 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...

  4. [leetcode] 4 寻找两个有序数组的中位数(二分+递归查找第K小数)(重要)

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

  5. Leetcode(4)寻找两个有序数组的中位数

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

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

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

  7. leetcode 4 --- 寻找两个有序数组的中位数

    1 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:设计一个时间复杂度为 O(log (m+n)) 的算法. 2 解 ...

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

    官方题解:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu- ...

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

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

  10. LeetCode(Python实现)—寻找两个有序数组的中位数

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

最新文章

  1. 开发效率不高?墙裂推荐这十款精选 IntelliJ IDEA 插件
  2. 3.2.2 OS之请求分页管理方式(请求页表、缺页中断机构、地址变换机构)
  3. [BUUCTF-pwn]——wustctf2020_getshell_2
  4. 湖北工程学院计算机宿舍,湖北工程学院宿舍条件,宿舍环境图片(10篇)
  5. labelimg如何调整框的颜色_新手如何快速做字幕?
  6. unity5 人皮渲染 Skin Shading
  7. model.evaluate 输出出一大串 ======================
  8. 分析java 嵌套类与内部类
  9. 【Aspose-CAD for Java】DWG如何优雅的转换成PDF文档!
  10. 干法:经营者应该怎样工作
  11. item_search - 根据关键词取拼多多商品列表
  12. echarts学习笔记1
  13. 什么是时序数据?如何治理?
  14. 攻防世界MISC(杂项)新手练习区
  15. 【PDF下载】大数据峰会之MaxCompute大数据语言的新发展
  16. 【算法小结】费马小定理
  17. 2021高考地理生物成绩查询,2021年北京市中考生物地理成绩查询时间
  18. 全志H616芯片香橙派Orange Pi Zero2开发板26pinGPIO口测试
  19. 【陈工笔记】# latex中如何将图片并排处理 #
  20. ABBYY FlexiCapture Engine 10.0:创建模板识别的新工具

热门文章

  1. rabbitmq java 测试_RabbitMQ 简单测试
  2. [日常] NOIWC2019 冬眠记
  3. 巴西龟饲养日志----冬眠记录2
  4. IntelliJ IDEA)中弹出“IntelliJ IDEA License Activation”时怎么办
  5. 计算机作文范文,未来计算机作文范文.docx
  6. openstack与ceph环境恢复云主机
  7. 精修图片不求人,百度经验
  8. 大一上學期學習生活情況總結
  9. 自由地思考——保护思想环境
  10. 生成二维码附带文字信息