leetcode上遇到的一道题,感觉很有意思

因为要求O(log(m+n)),所以第一反应时用二分来找,但是该怎么用二分呢?
数组A,B分别有序,我们可以先找到数组A中的一条分界线i,使得数组A分为A_left,和A_right两部分,那么因为时要找到中位数,我们可以直接计算出B数组的一条分界线j,使得size(Aleft)+size(Bleft)=size(Aright)+size(Bright),但此时还没有结束,因为还要满足max(aleft,bleft)<min(aright,bright)的,所以此时还要调整i的值(二分),然后通过i的值直接计算出j的值,以此循环,直到满足条件为止,设a数组大小为n,i为其分割点,b数组大小为m,j为其分割点,整体条件就是:

i+j=n+m-i-j when n+m is even or i+j=n+m+1-i-j when n+m is odd -> j=(n+m+1)/2-i m>=n。。。因为如果n>m的话j有可能小于0
a[i-1]<b[j] and a[i]>b[j-1]

对于i,j=0和i=n,j=m的边界条件需要特殊处理一下,也比较简单
比如当i=0,或者j=m时,我们不需要检查a[i-1]<b[j],只需要检查a[i]>b[j-1]

i>0,m>=n ->j=(n+m+1)/2-i<(m+n+1)/2<=(2m+1)/2==m
i<n,m>=n ->j=(n+m+1)/2-i>=(2n+1)/2-i>(2n+1)/2-n==0

这样循环的处理就简单了
1.当 i>0 and a[i-1]>b[j] -> i太大了
2.当 i<n and a[i]<b[j-1] -> i太小了
3.否则i位置合适

代码如下:

class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {if(nums2.size()<nums1.size()){return findMedianSortedArrays(nums2,nums1);}  int n=nums1.size(),m=nums2.size();int left = 0,right = n;double max_left=-1,min_right=-1;while(true){int i = (right+left)/2;int j = (m+n+1)/2-i;if(i<n && nums1[i] < nums2[j-1]) //i is small{left=i+1;}else if(i>0 && nums1[i-1] > nums2[j] )// i is big{right = i-1;}else{if(i==0)max_left=nums2[j-1];else if(j==0)max_left=nums1[i-1];else max_left=max(nums1[i-1],nums2[j-1]);if((n+m)%2)return max_left;if(i==n)min_right=nums2[j];else if(j==m)min_right=nums1[i];else min_right=min(nums1[i],nums2[j]);return (min_right+max_left)/2;}}return -1;}
};

算法题:两个有序数组求中位数相关推荐

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

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

  2. 【两个有序数组求中位数】

    /* 两个有序数组求中位数问题; 这个题有很多方法: 方法一:排序,找到中位数: 方法二:归并排序的思想 方法三:转换成求第k小值   */ /* 思路:使用二分查找,时间复杂度为log(m+n). ...

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

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

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

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

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

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

  6. 6 js 比较两个数组的差异_每天一道算法题(js)(3)——寻找两个有序数组的中位数...

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

  7. python【力扣LeetCode算法题库】4- 寻找两个有序数组的中位数

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

  8. 判断给定的两个数是否是亲和数_动画演示LeetCode算法题:004-寻找两个有序数组的中位数...

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

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

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

最新文章

  1. SAP SD基础知识之订单中装运相关的功能 II
  2. margin-before: 1em; margin-after: 1em;margin-start:0px;margin-end: 0px;
  3. bitmap文件格式分析
  4. Django获取请求参数方式
  5. PHPCMS内容模块标签
  6. html 移动app开发
  7. 当Python中混进一只薛定谔的猫……
  8. aloha app android,Aloha软件最新版下载-Aloha安卓版下载 v5.2.0-都去下载
  9. c语言文件中获取单词,从文本文件中读取单个单词并翻译 - C
  10. CIO40知识星球—5年工程师升职IT主管(22-27岁)
  11. iqc工作职责和工作内容_iqc组长岗位职责介绍
  12. 哪种耳机对听力伤害小?骨传导耳机能保护听力吗?
  13. R语言Duncan检验
  14. 如何在云服务器粘贴文件,云服务器粘贴文件
  15. 如何隐藏并禁止查看U盘
  16. Namenode 与 SecondaryNameNode
  17. 蓝光播放器中应用的触摸芯片
  18. thrift IDL
  19. CentOS 5.5 install Tomcat 6
  20. 冷热电气多能互补的微能源网鲁棒优化调度(Matlab代码实现)

热门文章

  1. [Unity] 让LineRenderer显示在UI层上方(RenderTexture 、RawImage)
  2. java 定时任务每月1号发送excel邮件
  3. Schtasks(计划任务)命令详解
  4. Spring 控制反转和依赖注入
  5. 淘宝购物车页面 智能搜索框Ajax异步加载数据
  6. Java 初级面试题
  7. 计算机三级数据库备考,备考:全国计算机三级数据库试题
  8. CMS和G1垃圾收集器
  9. 我的2016,成长之路总是充满坎坷
  10. 记:利用函数解决素数问题