[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 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俩有序数组的中位数的更多相关文章
- LeetCode 4 Median of Two Sorted Arrays (两个数组的mid值)
题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...
- 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...
- LeetCode(3) || Median of Two Sorted Arrays
LeetCode(3) || Median of Two Sorted Arrays 题记 之前做了3题,感觉难度一般,没想到突然来了这道比较难的,星期六花了一天的时间才做完,可见以前基础太差了. 题 ...
- Leetcode 4. Median of Two Sorted Arrays(二分)
4. Median of Two Sorted Arrays 题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/ Descr ...
- [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 ...
- 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 ...
- LeetCode 4. Median of Two Sorted Arrays & 归并排序
Median of Two Sorted Arrays 搜索时间复杂度的时候,看到归并排序比较适合这个题目.中位数直接取即可,所以重点是排序. 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个 ...
- 第三周 Leetcode 4. Median of Two Sorted Arrays (HARD)
4. Median of Two Sorted Arrays 给定两个有序的整数序列.求中位数,要求复杂度为对数级别. 通常的思路,我们二分搜索中位数,对某个序列里的某个数 我们可以在对数时间内通过二 ...
- 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 ...
随机推荐
- android ListView 可缩放,支持左右上下手势
public class ZoomListView extends ListView implements SwipeListener { public static enum Action { Le ...
- 1.1.10 word2010图片另存为存到图片库里,怎么修改之
1. 打开一个文档,在图片上右击,图片另存为,在弹出的[保存文件]对话框中. 2.单击左上角的[组织]下拉列表"属性"按钮,在弹出的[图片 属性]对话框中,单击[包含文件夹]按钮, ...
- 关于set_input_delay的用法分析
关于set_input_delay的用法分析 数据分为了系统同步和源同步: 对于下降沿采集数据的情况,当下降沿时钟延迟dv_afe到达无效数据最左端时,图中1位置,为最小延时,即采集不到有效数据的临界 ...
- Win7系统安装Centos7.0双系统(一)
项目环境测试,过去在虚拟机安装只要配置好镜像很快就可以轻松安装,但是在真实机中安装就有些略坑.网上有很多说法是把iso文件中安装引导拷出来,试了很久还是觉得U盘镜像直接安装更便捷.靠谱.因为CentO ...
- VS2010 修改模板文件,增加默认注释
在开发过程中往往需要在每一个页面(类)增加注释等等内容,VS2010中可以修改模板,在原有模板中增加一个类,会引用System等等命名空 间,以及一些程序集.下面我们来看看如何增加自己需要一些说明,比 ...
- Python的xml模块
先来一段xml代码 <?xml version="1.0"?> <data> <country name="Liechtenstein&qu ...
- [UE4]瞬移
1.设置Input,事件名称设置为Teleport 2.设置事件Teleport 3.
- DBus send byte array over gdbus ----Send dbus data
遇到一个问题,如何通过dbus传送uint8数组元素 有3种方法, 1.直接传 ay 2.传 a(y) 3.xml定义为 ay,但是通过annotation 强行将 guchar 转为GVarian ...
- 涂抹mysql笔记-搭建mysql高可用体系
mysql的高可用体系<>追求更高稳定性的服务体系 可扩展性:横向扩展(增加节点).纵向扩展(增加节点的硬件配置) 高可用性<>Slave+LVS+Keepalived实现高可 ...
- JS基础——变量
引用类型:对象 数组 函数 }; var b =a ; b.age = ; console.log(a.age);// 21 传递的是地址, a,b同地址 值类型: var a =100; var ...