题目:

给定两个大小为 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法:二分法
将数组A左边i个元素和数组B右边j个元素
使得i+j=(m-i)+(n-j)
 数组A剩下的len1-i和数组B剩下的len2-j个元素之和保持一致
此时只要满足条件a[i-1]<b[j]&&b[j-1]<a[i]时,中位数就可得
处理奇偶时,为保证i+j=(m+n)/2=>i+j=(m+n-1)/2 偶数=>不变 奇数平半分
因为不能直接改变i和j所有用start和end来控制,或者说是i的范围
int m=nums1.length,n=nums2.length;if(m>n)//保证len1<=len2return getZ(nums2,nums1);int start=0,end=m;int maxl = 0,minr = 0;while(start<=end) {int i=(start+end)/2;int j=(m+n+1)/2-i;if(i>start&&nums1[i-1]>nums2[j]) {//i太大应该变小,右边范围左移end--;}else if(i<end&&nums2[j-1]>nums1[i]){//i太小应该变大,左边范围扩大start++;}else {maxl=(i==0)?nums2[j-1]:((j==0)?nums1[i-1]:(nums1[i-1]>nums2[j-1]?nums1[i-1]:nums2[j-1]));if((m+n)%2!=0)return maxl;elseminr=(i==m)?nums2[j]:((j==n)?nums1[i]:(nums1[i]<nums2[j]?nums1[i]:nums2[j]));return (maxl+minr)/2.0;}}return 0.0;

过程中遇到的问题及理解:

1,红色第一处以及红色第二处如果规定为(i>=1)(i<=m)执行时间会变长,或者是说start和end为什么可以代表i的范围

2,此处的返回不能写在外面因为当m=0时,j可能会越界(如{}{1}这两个数组执行时),因此奇数时直接返回,而只有奇数时才会越界

3,end--和start++的确定不太明白,还是想不通start和end为什么可以代表i的范围

###########################################################################

更新:改变了下面红色代码,二分法不断选择正确的一半的区间

 int m=nums1.length,n=nums2.length;if(m>n)//保证len1<=len2return getZ(nums2,nums1);int start=0,end=m;int maxl = 0,minr = 0;while(start<=end) {int i=(start+end)/2;int j=(m+n+1)/2-i;if(i>start&&nums1[i-1]>nums2[j]) {//i太大应该变小,右边范围左移end=i-1;}else if(i<end&&nums2[j-1]>nums1[i]){//i太小应该变大,左边范围扩大start=1+i;}else {maxl=(i==0)?nums2[j-1]:((j==0)?nums1[i-1]:(nums1[i-1]>nums2[j-1]?nums1[i-1]:nums2[j-1]));if((m+n)%2!=0)return maxl;elseminr=(i==m)?nums2[j]:((j==n)?nums1[i]:(nums1[i]<nums2[j]?nums1[i]:nums2[j]));return (maxl+minr)/2.0;}}return 0.0;

问题是测试显示这个运行时间更长

LeetCode寻找两个有序数组的中位数相关推荐

  1. LeetCode——寻找两个有序数组的中位数

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

  2. leetcode 寻找两个有序数组的中位数 hard

    题目链接 这篇文章写得很全面:https://www.cnblogs.com/grandyang/p/4465932.html 摘抄如下: 这道题让我们求两个有序数组的中位数,而且限制了时间复杂度为O ...

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

    2085 / 2085 个通过测试用例 状态:通过 执行用时:4 ms 内存消耗:47.6 MB 提交时间:6 月,4 周之前 class Solution {public double findMe ...

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

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

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

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

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

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

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

    Python寻找两个有序数组的中位数 审题: 找出意味着这是一个查找算法题 算法复杂度log级别,就是提示你是二分查找 二分查找实现一般为递归 (1)递归包括递归体 (2)终止条件 思路: 定理: 有 ...

  8. 两个有序数组的中位数 python_Python寻找两个有序数组的中位数实例详解

    Python寻找两个有序数组的中位数 审题: 1.找出意味着这是一个查找算法题 2.算法复杂度log级别,就是提示你是二分查找 3.二分查找实现一般为递归 (1)递归包括递归体 (2)终止条件 思路: ...

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

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

  10. (JS)寻找两个有序数组的中位数

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

最新文章

  1. android 关闭jack_Android7.0 配置JACK支持多用户同时编译
  2. 行为模式之Mediator模式
  3. 用 TWebBrowser 查找网页上的按钮,编辑框,
  4. 数据结构与算法 / 排序算法 / 堆排序
  5. Error: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-965200530-172.21.
  6. android 性能优化---(2) MTK 平台开机时间优化
  7. 通过Console口本地加载系统程序
  8. php中foreach()的用法
  9. 信息处理技术员的作用
  10. 仓储管理之计价方法——移动加权平均法
  11. 微信开发之微信jssdk录音功能开发
  12. 墙裂推荐9个在线图片压缩网站
  13. Office操作技巧——利用Excel实现文件夹批量重命名
  14. linux无线网卡驱动编写,博通无线网卡驱动linux版
  15. Python Pymysql实现数据存储
  16. 大厂Java面试过程中如何介绍自己的项目经历?
  17. 通信原理学习笔记6-2:数字解调——抽样和符号同步
  18. 工作日常记录:整数有符号数除以无符号数的那些事
  19. LVDS display 应用
  20. 微信小程序模拟车位选择功能(简陋版本)

热门文章

  1. 视达配色教程1 色彩是什么
  2. 阿里云服务器连接ftp服务(软件的使用)
  3. ufldl学习笔记与编程作业:Linear Regression(线性回归)
  4. CentOS下配置apache+gitweb
  5. CAS(Compare and Swap)理解
  6. 上拉加载下拉刷新控件WaterRefreshLoadMoreView
  7. java统计中英文字数 Java问题通用解决代码
  8. 异常,性能损失在哪?
  9. oracle ogg下载安装,牛刀小试Oracle GoldenGate--OGG安装(一)
  10. 【数据分享】糖尿病患者研究数据集