LintCode: Median of two Sorted Arrays
求第k个值
1.归并排序
归并到第k个值为止
时间复杂度:O(k)
class Solution {
public:
// merge-sort to find K-th value
double helper(vector<int> A, vector<int> B, int lenA, int lenB, int k) {
int i = , j = ;
while ((i < lenA) && (j < lenB)) {
k--;
if (A[i] < B[j]) {
if ( == k) {
return A[i];
}
++i;
} else if ( == k) {
return B[j];
} else {
++j;
}
}
return (i >= lenA)?B[j + k - ]:A[i + k - ];
}
/**
* @param A: An integer array.
* @param B: An integer array.
* @return: a double whose format is *.5 or *.0
*/
double findMedianSortedArrays(vector<int> A, vector<int> B) {
// write your code here
int m = A.size();
int n = B.size();
return ((m + n) & )?
(helper(A, B, m, n, (m + n + )>>)):
(((helper(A, B, m, n, ((m + n)>>) + ))+(helper(A, B, m, n, (m + n)>>))) * .);
}
};
2. 分治法
利用归并的思想,从a和b中一共取k个数
假设len(a)<len(b)
从a中取pa = min(k/2, len(a))个元素;
从b中取pb = k-pa个元素;
如果a[pa - 1]<b[pb - 1],则归并排序时先归并a[pa - 1],说明a数组的数取“少”了,不够用
a到终点后,只用b的数凑足了k个,这说明总的第k大的值不会出现在a[0...pa-1]里边,所以我们扔掉前pa个数
对于b数组,说明总的第k大的数不会出现在b[pb...lenB]里边,pb后边的数就没用了
如果a[pa - 1]>=b[pb - 1],是对称情况
归并排序时,会先归并b[pb - 1],说明b数组的数取“少”了,不够用
b到终点后,只用a的数凑足了k个,这说明总的第k大的值不会出现在b[0...pb-1]里边,所以我们扔掉前pb个数
对于a数组,说明第k大的数不会出现在a[pa...lenA]里边,pa的后边就没用了
总结:扔掉较小数组的前一部分,扔掉较大数组的后一部分
复杂度分析:O(logK), K每次几乎减少一半
class Solution {
public:
// merge-sort to find K-th value
double helper(int *A, int *B, int lenA, int lenB, int k) {
if (lenA > lenB) {
return helper(B, A, lenB, lenA, k);
}
// lenA <= lenB
if (lenA == ) {
return B[k - ];
}
if ( == k) {
return min(A[], B[]);
}
int pa = min(lenA, k >> ), pb = k - pa;
return (A[pa - ] < B[pb - ])?
helper(A + pa, B, lenA - pa, lenB, k - pa):
helper(A, B + pb, lenA, lenB - pb, k - pb);
}
/**
* @param A: An integer array.
* @param B: An integer array.
* @return: a double whose format is *.5 or *.0
*/
double findMedianSortedArrays(vector<int> A, vector<int> B) {
// write your code here
int m = A.size();
int n = B.size();
return ((m + n) & )?
(helper(A.data(), B.data(), m, n, (m + n + )>>)):
(((helper(A.data(), B.data(), m, n, ((m + n)>>) + ))+(helper(A.data(), B.data(), m, n, (m + n)>>))) * .);
}
};
LintCode: Median of two Sorted Arrays的更多相关文章
- [LintCode] Median of Two Sorted Arrays 两个有序数组的中位数
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...
- 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...
- 2.Median of Two Sorted Arrays (两个排序数组的中位数)
要求:Median of Two Sorted Arrays (求两个排序数组的中位数) 分析:1. 两个数组含有的数字总数为偶数或奇数两种情况.2. 有数组可能为空. 解决方法: 1.排序法 时间复 ...
- 【转载】两个排序数组的中位数 / 第K大元素(Median of Two Sorted Arrays)
转自 http://blog.csdn.net/zxzxy1988/article/details/8587244 给定两个已经排序好的数组(可能为空),找到两者所有元素中第k大的元素.另外一种更加具 ...
- LeetCode 4 Median of Two Sorted Arrays (两个数组的mid值)
题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...
- No.004 Median of Two Sorted Arrays
4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...
- leetcode第四题:Median of Two Sorted Arrays (java)
Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...
- LeetCode(3) || Median of Two Sorted Arrays
LeetCode(3) || Median of Two Sorted Arrays 题记 之前做了3题,感觉难度一般,没想到突然来了这道比较难的,星期六花了一天的时间才做完,可见以前基础太差了. 题 ...
- Kotlin实现LeetCode算法题之Median of Two Sorted Arrays
题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...
随机推荐
- 在ASP.NET MVC4中实现同页面增删改查,无弹出框02,增删改查界面设计
在上一篇"在ASP.NET MVC4中实现同页面增删改查,无弹出框01,Repository的搭建"中,已经搭建好了Repository层,本篇就剩下增删改查的界面了......今 ...
- UIWebView 大全
<html> <head> </head> <body> <img src = "http://t1.baidu.com/it/u=10 ...
- vs已停止工作
第一步: 开始-->所有程序-->Microsoft Visual Studio 2012-->VisualStudio Tools-->VS2012 开发人员命令提示(以管理 ...
- Snail—UI学习之得到某组件的方法
第一种方法:依据传入函数的參数对象的tag属性区分 比方 多个button运行同一个方法,可是不同的方法运行时.里面的逻辑又不一样 那就得加以区分 这时能够用tag来差别 //再新建一个Button ...
- 我们的生活第二季/全集This Is Us迅雷下载
NBC剧集<我们这一天>宣布一次性续订2.3季,这部Dan Fogelman打造的大热剧是这个秋季档收视人数第二的广播网剧情剧.新续订的两季还是每季18集. NBC的叫好叫座剧<我们 ...
- 大西洋帝国第一季/全集Boardwalk Empire1迅雷下载
大西洋帝国 第一季 Boardwalk Empire Season 1 (2010) 本季看点:1920年,联邦政府颁布禁酒令后,公开售卖酒类商品成为一种违法行为.在新泽西州的西南部的大西洋城没有任何 ...
- epoll的两种工作模式
epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在採用这两种模式时要注意的是,假设採用ET模式,那么仅当状态发生变化时才会通知,而採用L ...
- Python 网络请求模块 urllib 、requests
Python 给人的印象是抓取网页非常方便,提供这种生产力的,主要依靠的就是 urllib.requests这两个模块. urlib 介绍 urllib.request 提供了一个 urlopen 函 ...
- JAVA基础知识之编译、运行、打包
一:java环境设置在环境变量中设置以下三个变量: JAVA_HOME=C:\j2sdk1.4.1 //可以改为相应的目录CLASSPATH=%JAVA_HOME%\lib\tools.jar;%JA ...
- hyper-V下虚拟机连接外网,怎么才能将Hyper-V 的虚拟机接入互联网?
现在情况是这样的: windows hyper-V主机IP: 192.168.20.3 hyper-v虚拟网卡IP:192.168.20.13 虚拟机1IP:192.168.20.21 同一局域网主机 ...