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;
}

linckye
32 声望1 粉丝

成功捕获一枚 Java


« 上一篇
子数组系列
下一篇 »
回文串