题目:

给定两个大小为 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<=len2
return 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;
else
minr=(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<=len2
   return 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;
    else
     minr=(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 Golang 4. 寻找两个有序数组的中位数

    4. 寻找两个有序数组的中位数 很明显我偷了懒, 没有给出正确的算法,因为官方的解法需要时间仔细看一下... func findMedianSortedArrays(nums1 []int, nums ...

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

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

  4. Java实现 LeetCode 4 寻找两个有序数组的中位数

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

  5. 0004. 寻找两个有序数组的中位数(Java)

    4. 寻找两个有序数组的中位数 https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 最简单的就是用最简单的,把两个数组分别抽出然 ...

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

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

  7. leetcode题目4.寻找两个有序数组的中位数(困难)

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

  8. leetcode刷题四<寻找两个有序数组的中位数>

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

  9. [LeetCode] 4. 寻找两个有序数组的中位数

    题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 ...

随机推荐

  1. Robberies 杭电

    可怜的POIUYTREWQ最近想买下dota2的商品,但是手头缺钱.他想起了之前看过的一部大片,觉得抢银行也许是个不错的选择.他认为,坏人被抓是因为没有预先规划.于是他在之前的几个月对各大银行进行了一 ...

  2. 常见的Web源码泄漏漏洞及其利用

    Web源码泄露的漏洞: git源码泄露 svn源码泄露 hg源码泄漏 网站备份压缩文件 WEB-INF/web.xml 泄露 DS_Store 文件泄露 SWP 文件泄露 CVS泄露 Bzr泄露 Gi ...

  3. [转载]利用分块传输绕过WAF进行SQL注入

    原理 客户端给服务器发送数据的时候,如果我们利用协议去制作payload,就可以绕过http协议的waf,实现SQL注入 分块传输编码(Chunked transfer encoding)是HTTP中 ...

  4. 【山外问道】Linux UUID的查询方法

    本文打印版下载地址 [山外问道]Linux_UUID的查询方法-打印版.pdf 一.查询存储设备的UUID 1.使用blkid命令查看 (1)查询所有存储设备的UUID:blkid. (2)查询指定设 ...

  5. Java如何遍历二维数据

    /* 需求:二维数组遍历 外循环控制的是二维数组的长度,其实就是一维数组的个数. 内循环控制的是一维数组的长度.*/class Array2Test { public static void main ...

  6. 大数据并行计算框架Spark

    Spark2.1. http://dblab.xmu.edu.cn/blog/1689-2/ 0+入门:Spark的安装和使用(Python版) Spark2.1.0+入门:第一个Spark应用程序: ...

  7. Java 基础之详解 Java 反射机制

    一.什么是 Java 的反射机制?   反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...

  8. 笔记-VUE滚动加载更多数据

    来源:https://blog.csdn.net/qq_17281881/article/details/87342403 VUE滚动加载更多数据 data() { return { loading: ...

  9. (第一篇)linux简介与发展历史以及软件的安装

    1.Linux操作系统基本结构介绍: 操作系统: 英文名称Operating System,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统 ...

  10. docker容器介绍

                       Docker容器 一.什么是Docker? Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Git ...