There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

You may assume nums1 and nums2 cannot be both empty.

Example 1:

nums1 = [1, 3]
nums2 = [2] The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4] The median is (2 + 3)/2 = 2.5

Solution1: time complexity is O(m+n). merge two sorted array, then find the median

code:

 /*
Time Complexity: O(m+n)
Space Complexity: O(m+n)
*/ class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) { // find median
int[] mergedArray = mergeTwoSortedArray(nums1, nums2);
int n = mergedArray.length;
if( n % 2 == 0){
return (mergedArray[(n-1)/2] + mergedArray[n/2])/2.0;
}else{
return mergedArray[n/2];
}
} public int[] mergeTwoSortedArray(int[] nums1, int[] nums2){ // merge sort
int[] merged = new int[nums1.length + nums2.length];
int i = 0, j = 0, k = 0;
// 两个array同时扫
while( i < nums1.length && j < nums2.length){
merged[k++] = (nums1[i] < nums2[j]) ? nums1[i++] : nums2[j++];
}
//扫到只剩下较长的那个array, either nums1 or nums2
while ( i < nums1.length ){
merged[k++] = nums1[i++];
}
while(j < nums2.length){
merged[k++] = nums2[j++];
}
return merged;
}
}

Solution2: time complexity is O(log (m+n)).

这个题的思路可以是找出2个sorted array 所有元素中,Kth 元素

因此我们可以把问题转化成,

“Given 2 sorted arrays, A, B of sizes m, n respectively, find the numbers which are NOT medians of the two sorted arrays”

如果我们能找到那些NOT medians的数字,删掉,并不断缩小范围,那最终剩下的一定就是actual median

Step1, 确定要找的median是merged之后array中的第几个元素

Step2, 用binary search切开nums1, nums2。发现nums1左半边的长度为4, nums2左半边的长度为2。

Step3, nums1左半边长度+ nums2左半边长度为6

Step4, 所以第7个元素可能在nums1的右半边pivot上,或者在nums2的右半边pivot上

比较发现,第7个元素应该是7

code:

 /*
Time Complexity: O(log(m+n))
Space Complexity: O(log(m+n))
*/ class Solution {
public double findMedianSortedArrays(final int[] A, final int[] B) {
int total = A.length + B.length;
if (total %2 == 0){
return (findKth(A, 0, B, 0, total / 2) + findKth(A, 0, B, 0, total / 2 + 1)) / 2.0;
}else{
return findKth(A, 0, B, 0, total / 2 + 1);
}
} private static int findKth(final int[] A, int ai, final int[] B, int bi, int k) {
//always assume that A is shorter than B
if (A.length - ai > B.length - bi) {
return findKth(B, bi, A, ai, k);
}
if (A.length - ai == 0) return B[bi + k - 1];
if (k == 1) return Math.min(A[ai], B[bi]); //divide k into two parts
int k1 = Math.min(k / 2, A.length - ai), k2 = k - k1;
if (A[ai + k1 - 1] < B[bi + k2 - 1])
return findKth(A, ai + k1, B, bi, k - k1);
else if (A[ai + k1 - 1] > B[bi + k2 - 1])
return findKth(A, ai, B, bi + k2, k - k2);
else
return A[ai + k1 - 1];
}
}

[leetcode]4. Median of Two Sorted Arrays俩有序数组的中位数的更多相关文章

  1. LeetCode 4 Median of Two Sorted Arrays (两个数组的mid值)

    题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...

  2. 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays

    一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...

  3. LeetCode(3) || Median of Two Sorted Arrays

    LeetCode(3) || Median of Two Sorted Arrays 题记 之前做了3题,感觉难度一般,没想到突然来了这道比较难的,星期六花了一天的时间才做完,可见以前基础太差了. 题 ...

  4. Leetcode 4. Median of Two Sorted Arrays(二分)

    4. Median of Two Sorted Arrays 题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/ Descr ...

  5. [LeetCode] 4. Median of Two Sorted Arrays 两个有序数组的中位数

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  6. Leetcode 5——Median of Two Sorted Arrays

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

  7. LeetCode 4. Median of Two Sorted Arrays & 归并排序

    Median of Two Sorted Arrays 搜索时间复杂度的时候,看到归并排序比较适合这个题目.中位数直接取即可,所以重点是排序. 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个 ...

  8. 第三周 Leetcode 4. Median of Two Sorted Arrays (HARD)

    4. Median of Two Sorted Arrays 给定两个有序的整数序列.求中位数,要求复杂度为对数级别. 通常的思路,我们二分搜索中位数,对某个序列里的某个数 我们可以在对数时间内通过二 ...

  9. Leetcode 4. Median of Two Sorted Arrays(中位数+二分答案+递归)

    4. Median of Two Sorted Arrays Hard There are two sorted arrays nums1 and nums2 of size m and n resp ...

随机推荐

  1. fromkeys()

    #fromkeys() #说明:用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值 #案例 d=[1,2,3] dict={} dict=dict.fromkeys( ...

  2. PhpAdmin支持登录远程数据库服务器

    转载:http://www.cnblogs.com/andydao/p/4227312.html 该数据,百度搜不到,Google1分钟搞定 一.如何设置phpMyAdmin自动登录? 首先在根目录找 ...

  3. Spring生态研习【三】:Spring-kafka

    1. 基本信息介绍 基于spring的kafka应用,非常简单即可搭建起来,前提是要有一个kafka的broker集群.我在之前的博文里面已经介绍并搭建了一套broker环境,参考Kafka研究[一] ...

  4. Windows下好用的git客户端--GitExtentions

    用git: https://git-scm.com/downloads GitExtentions: https://sourceforge.net/projects/gitextensions/ B ...

  5. Maya中输出alembic文件的方法

    Maya中输出alembic文件是有现成api调用的,与maya中大部分api一样,这个功能参数的传入是非常类似mel的,本质上讲都是kwargs类型的参数,所以我们传入的参数就需要整理成类似于mel ...

  6. CentOS 7安装WordPress

    在开始本文前,我假定你已经安装好了nginx.php-fpm和mariaDB(或mysql).它们的安装过程可参考我以前的文章. 1. 安装EPEL(Extra Packages for Enterp ...

  7. Web jsp开发学习——网上直播聊天室的简单开发

    整个界面为chat.jsp: 如果用户没有登录,就不能进行聊天. 为将发言的句子传到页面上,要设置一个<iframe></iframe>虚拟框架,将allmessage.jsp ...

  8. Linux上启动Cron任务

    cron是一个Linux下的定时执行工具,无需人工干预,与quartz上的cron表达式稍有不同.由于cron是Linux上的内置基础服务,并不是所有服务器都是默认启动该服务的,如果没有启动可以使用下 ...

  9. background-size的应用情景:当给出的背景图片大于实际网页需要布局的图片大小时

    网页需求是:50*50 如果只设置  width:50px;height:50px;background-image("images/XXX.png"); 效果如下: 添加设置:b ...

  10. 多端统一框架尝试--Taro

    参考资料 Taro官网Taro GitHubTaro资源汇总Taro-UI 我的demo代码 github地址 Taro介绍和尝试心得 Taro是基于React语法规范开发的多端统一的框架,一套代码可 ...