[LeetCode4. 寻找两个正序数组的中位数] | 刷题打卡

202 阅读1分钟

题目描述

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]

输出:2.00000

解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]

输出:2.50000

解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

示例 3:

输入:nums1 = [0,0], nums2 = [0,0]

输出:0.00000

示例 4:

输入:nums1 = [], nums2 = [1]

输出:1.00000

示例 5:

输入:nums1 = [2], nums2 = []

输出:2.00000  

提示:

nums1.length == m

nums2.length == n

0 <= m <= 1000

0 <= n <= 1000

1 <= m + n <= 2000

-106 <= nums1[i], nums2[i] <= 106

进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

来源:力扣(LeetCode) 链接: 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

根据题目描述,求两个数组中位数。 判断总元素个数单双,把两个数组当队列,比较队头元素,小的出栈(注意处理边界问题),循环处理得出中位数

AC 代码

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    if (nums1Size == 0) {
        if (nums2Size & 1) {
            return nums2[nums2Size >> 1];
        } else {
            return (nums2[nums2Size >> 1] + nums2[(nums2Size >> 1) - 1]) / 2.0;
        }
    }

    if (nums2Size == 0) {
        if (nums1Size & 1) {
            return nums1[nums1Size >> 1];
        } else {
            return (nums1[nums1Size >> 1] + nums1[(nums1Size >> 1) - 1]) / 2.0;
        }
    }

    const int limit = (nums1Size + nums2Size) >> 1;
    int i1, i2;
    i1 = i2 = 0;

    if ((nums1Size + nums2Size) & 1) {
        int res;
        for (int i = 0; i <= limit; ++i) {
            if (i2 >= nums2Size || (i1 < nums1Size && nums1[i1] < nums2[i2])) {
                res = nums1[i1++];
                continue;
            }
            res = nums2[i2++];
        }
        return res;
    }

    int res1, res2;
    res1 = res2 = 0;
    for (int i = 0; i <= limit; ++i) {
        res1 = res2;
        if (i2 >= nums2Size || (i1 < nums1Size && nums1[i1] < nums2[i2])) {
            res2 = nums1[i1++];
            continue;
        }
        res2 = nums2[i2++];
    }

    return (res1 + res2) / 2.0;
}

总结

  • 解法1 合并两个数组再排序,获取中位数
  • 解法2 判断总元素个数单双,把两个数组当队列,比较队头元素,小的出栈(注意处理边界问题),循环处理得出中位数

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情