Median of Two Sorted Arrays (Hard)
问题描述
给出两个升序数组,求两数组的中值,原代码见 GitHub 17/05/26
Examples 1
Input
nums1 = [1, 3]
nums2 = [2]
Output
The median is 2.0
Examples 1
Input
nums1 = [1, 2]
nums2 = [3, 4]
Output
The median is (2 + 3) / 2 = 2.5
算法思路
首先当然要将两数组按升序 合并,然后再在合并后的数组中取中值
轮询两数组,当一方 越界 时便停止移动
每次都从中挑选出 更小的值,插入到新数组中
其实这道算法的思路,有点像 归并排序 中的 merge 思想,只不过 前者 是将原数组插入新数组,后者 则是将原数组插入新数组后,再插回原数组
官方标记此题为 Hard,但个人并不赞同,在此记录只不过是因为 Hard 标签的缘故
AC 代码
double findMedianSortedArrays(vector<int>& nums1,
vector<int>& nums2) {
const int MAX = 0x7fffffff;
int val1, val2;
int i1 = 0, i2 = 0;
const int size1 = nums1.size(), size2 = nums2.size();
vector<int> merge(size1 + size2);
int j = 0;
while (j++ < merge.size()) {
// stops when overflow
if (i1 == size1) {
val1 = MAX;
} else {
val1 = nums1[i1];
}
if (i2 == size2) {
val2 = MAX;
} else {
val2 = nums2[i2];
}
// pick smaller one
if (val1 < val2) {
merge[j] = val1;
i1++;
} else {
merge[j] = val2;
i2++;
}
}
double result;
if (merge.size() % 2 == 0) {
// even
int off = merge.size() / 2;
result = (double) (merge[off] + merge[off - 1]) / 2;
} else {
// odd
result = (double) merge[merge.size() / 2];
}
return result;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。