[array] leetCode-4-Median of Two Sorted Arrays-Hard
leetCode-4-Median of Two Sorted Arrays-Hard
descrition
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)).
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
解析
注意题目对时间复杂度的要求:O(log (m+n)),在加上数组有序的条件,此处应该联想到二分搜索的优化。那要如何用呢?看下面分析。(也可以参考 leetcode 中的 solution,解释得也很好)
定义函数接口:
double findMedianSortedArrays(vector<int>& A, vector<int>& B)
即两个数组 A, B,假设大小分别为 m 和 n
将数组 A 根据任意位置 i 分成左右两部分,同理 B 根据任意位置 j 也分成左右两部分,如下:
left_part | right_part
A[0], A[1], ..., A[i-1] | A[i], A[i+1], ... , A[m]
B[0], B[1], ..., B[j-1] | B[j], B[j+1], ... , B[n]
由中位数的定义以及数组有序的条件,我们希望以上划分满足:
len(left_part) = len(right_part)
==> i+j = m-i + n-j (or: i+j = m-i + n-j + 1 (奇数的情况,将多的一个放到左边))
==> j = (m+n+1)/2 - i, i=[0,m]
max(left_part) <= min(right_part) ==> A[i-1] <= B[j] && B[j-1] <= A[i]
由此我们只需要在有序数组 A 上进行二分查找,确定 i 的位置,使得以上条件满足即可找到合适的划分。在此基础上我们可以根据划分边界求得 median。
初始条件:imin = 0, imax = m;
当 imin <= imax 时候的一次迭代:
i = (imin + imax) / 2
j = (m+n+1)/2 - i
// 此处讨论暂时不考虑边界情况,即假设 i 和 j 都合法
// 只可能出现以下几种情况:
(1) A[i-1] <= B[j] && B[j-1] <= A[i]
// 划分满足要求,可以停止循环
(2) A[i-1] > B[j]
// A[i-1] 太大,也就是我们要想办法调整 i 的值使得 A[i-1] <= B[j] 成立
// 这个时候如果我们增大 i,只会使得 A[i-1] 更大 (因为数组是非递减有序的)
// 因此我们只能通过减小 i,尝试找到更小的 A[i-1],因此作出如下调整
imax = i-1
(3) B[j-1] > A[i]
// B[j-1] 太大,同理我们应该减小 j
// 从另一个角度,减小 j 就相当于增大 i,因此我们作出以下调整
imin = i+1
几个细节:
- m <= n 必须成立。因为 j = (m+n+1)/2 - i,如果 m>n,那么 j 将有可能为负数。因此在程序的开始进行检查。
- 边界条件的讨论。当 i0, j0, im, jn 时,A[i-1], B[j-1], A[i], B[j] 都是不成立的。如果 i 和 j 都满足要求时,我们需要检查 A[i-1] <= B[j] && B[j-1] <= A[i] 是否成立,那么当 i 和 j 到达边界条件时,我们也就不需要检查其中的某一个条件,比如当 i == 0 时, A 数组的左边为空,我们就不需要检查 A[i-1] <= B[j] 这个条件。(参看代码)
code
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution{
public:
double findMedianSortedArrays(vector<int>& A, vector<int>& B){
// insure the size of A is less than and equal to the size of B
if(A.size() > B.size())
swap(A, B);
int m = A.size();
int n = B.size();
// m <= n
// when m+n is odd, the follow equation will insure the median
// will be assined into left part.
int lenLeft = (m+n+1) / 2;
// binary search
int imin = 0, imax = m;
while(imin <= imax){
int i = (imin + imax) / 2;
int j = lenLeft - i;
if( i>0 && A[i-1] > B[j]){
// A[i-1] too large, decreasing i
// i > 0 ==> j<n, because j = (m+n+1) / 2 - i < (m+n+1) / 2 < 2n+1/2 < n
imax = i-1;
}else if ( i<m && B[j-1] > A[i]){
// A[i] too small, increasing i
// i < m ==> j>0, because j = (m+n+1) / 2 - i > (m+n+1) / 2 - m > (2m+1)/2 - m > 0
imin = i+1;
}else{
// perfit
int maxLeft = 0;
if(i == 0){
maxLeft = B[j-1];
}else if (j == 0){
maxLeft = A[i-1];
}else{
maxLeft = max(B[j-1], A[i-1]);
}
if( ((n+m)&1) == 1) // odd
return maxLeft;
int minRight = 0;
if(i == m){
minRight = B[j];
}else if (j == n){
minRight = A[i];
}else{
minRight = min(B[j], A[i]);
}
return (maxLeft + minRight)*1.0 / 2.0;
}
}
return 0.0;
}
};
int main()
{
return 0;
}
[array] leetCode-4-Median of Two Sorted Arrays-Hard的更多相关文章
- 【算法之美】求解两个有序数组的中位数 — 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 (两个数组的mid值)
题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...
- 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 & 归并排序
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 ...
- LeetCode 004 Median of Two Sorted Arrays
题目描述:Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. F ...
- leetcode 4. Median of Two Sorted Arrays
https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 and num ...
- leetcode之 median of two sorted arrays
这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉.后来搜了一下leetcode的难度分布表(leetc ...
随机推荐
- Egg + Vue 服务端渲染工程化实现
在实现 egg + vue 服务端渲染工程化实现之前,我们先来看看前面两篇关于Webpack构建和Egg的文章: 在 Webpack工程化解决方案easywebpack 文章中我们提到了基于 Vue ...
- apollo实现c#与android消息推送(一)
之前做了c#推送消息到手机端,限于网络要求,不能使用百度等现成的推送,查了许多资料,七拼八凑终于凑齐,记录下来,即是复习也是希望对来者有所帮助. 我开发的环境是windows,使用java开发的Apa ...
- oracle排序的几种方法
1.创建数据库表 CREATE TABLE USER_INFO( USERID VARCHAR2(10 BYTE) NOT NULL, USERNAME ...
- “一切都是消息”--MSF(消息服务框架)之【发布-订阅】模式
在上一篇,“一切都是消息”--MSF(消息服务框架)之[请求-响应]模式 ,我们演示了MSF实现简单的请求-响应模式的示例,今天来看看如何实现[发布-订阅]模式.简单来说,该模式的工作过程是: 客户端 ...
- 悟透JavaScript (一)
首先说明,这是别人写的一篇文章,写得很好,对理解JavaScript很有好处,所以转帖过来. 引子 编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中 ...
- C# 文件下载
在a标签href属性直接写文件地址有些文件不会进入下载(例如 图片类型),浏览器会自动打开预览这时可以使用下面这种方式进行文件下载 Html代码 <a href="/DownloadF ...
- MySQL 高效查询
在“现场加号&预约排队”项目中,“号贩子排查任务”在线下测试的时候没有问题,但是线上后,由于线上的数据量较大,导致在执行查询的时系统崩溃:后来经过查找,发现写的sql不合理,查出了许多用不到的 ...
- Linux 进程与信号的概念和操作
进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 信号与进程几乎控制了操作系统的每个任务. 在shell中输 ...
- 张高兴的 Xamarin.Android 学习笔记:(二)“Hello World”
完成环境配置后开始第一个简单项目.打开 Visual Studio 新建一个 Xamarin.Android 项目 "HelloAndroid".(GitHub:https://g ...
- 单源最短路径问题-Dijkstra算法
同样是层序遍历,在每次迭代中挑出最小的设置为已知 ===================================== 2017年9月18日10:00:03 dijkstra并不是完全的层序遍历 ...