0004.寻找两个正序数组的中位数

寻找两个正序数组的中位数

困难

给定两个大小分别为 mn 的正序(从小到大)数组 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
  • \(-10^6\)<= nums1[i], nums2[i] <=\(10^6\)

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

通过次数388,596提交次数972,537


版本1

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    double size = (nums1Size + nums2Size + 1.) / 2.;
    int i = 0, j = 0;
    int num0 = 0, num1 = 0;
    for (int idx = 0; idx < size; ++idx){
        num0 = num1;
        if (i >= nums1Size){
            num1 = nums2[j];
            ++j;
        } else if (j >= nums2Size){
            num1 = nums1[i];
            ++i;
        } else if (nums1[i] > nums2[j]){
            num1 = nums2[j];
            ++j;
        } else {
            num1 = nums1[i];
            ++i;
        }
    }

    if ((nums1Size+nums2Size)%2 == 0){
        return (num0 + num1) / 2.;
    } else {
        return num1;
    }
}

时间:16ms;内存:6.4MB

完整算法

滑动下标法

#include <stdio.h>

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size);

int main(int argc, char** argv){
    int nums1[] = {1,3};
    int nums2[] = {2};
    double mid = findMedianSortedArrays(nums1, 2, nums2, 1);
    printf("mid:%.1f\n", mid);

    return 0;
}

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    double size = (nums1Size + nums2Size + 1.) / 2.;
    int i = 0, j = 0;
    int num0 = 0, num1 = 0;
    for (int idx = 0; idx < size; ++idx){
        num0 = num1;
        if (i >= nums1Size){
            num1 = nums2[j];
            ++j;
        } else if (j >= nums2Size){
            num1 = nums1[i];
            ++i;
        } else if (nums1[i] > nums2[j]){
            num1 = nums2[j];
            ++j;
        } else {
            num1 = nums1[i];
            ++i;
        }
    }

    if ((nums1Size+nums2Size)%2 == 0){
        return (num0 + num1) / 2.;
    } else {
        return num1;
    }
}

output:

mid:2.0

时间:16ms;内存:6.4MB

posted @ 2021-04-19 20:29  keep-minding  阅读(66)  评论(0)    收藏  举报