#leetcode刷题之路4-寻找两个有序数组的中位数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。

示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0

示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5

 

思路:计算两个数组的长度,按照依次对比大小的方式把两个数组合并成一个,按照长度求出计算中位数的是哪两个(长度和为偶数)或一个(长度和为奇数)。然后普通思路进行。。。

#include <iostream>
#include <vector>

double findMedianSortedArrays(std::vector<int>& nums1, std::vector<int>& nums2) {
    int len1 = nums1.size();
    int len2 = nums2.size();
    int a = 0, b = 0;
    int count = 0;
    if (((len1 + len2) % 2) == 0)
    {
        int num1 = (len1 + len2) / 2;
        int num2 = (len1 + len2) / 2 + 1;
        double  *s = new double[num2];
        while (count<num2)
        {
            if ((a<len1&&b<len2&&nums1[a]<=nums2[b]) || (a<len1&&b == len2))
            {
                s[count] = nums1[a];
                a++;
            }
            else if ((a<len1&&b<len2&&nums1[a]>nums2[b]) || (b < len2&&a == len1))
            {
                s[count] = nums2[b];
                b++;
            }
            else
                break;
            count++;
        }
        double temp1 = s[num2 - 1];
        double temp2 = s[num1 - 1];
        delete[] s;
        return (temp1+temp2) / 2;
    }
    else
    {
        int num1 = (len1 + len2) / 2 + 1;
        double *s = new double[num1 + 1];
        while (count<num1+1)
        {
            if ((a<len1&&b<len2&&nums1[a]<=nums2[b]) || (a<len1&&b == len2))
            {
                s[count] = nums1[a];
                a++;
            }
            else if ((a<len1&&b<len2&&nums1[a]>nums2[b]) || (b < len2&&a == len1))
            {
                s[count] = nums2[b];
                b++;
            }
            else
                break;
            count++;
        }
        double temp = s[num1 - 1];
        delete[] s;
        return temp;
    }
}
int main() {
    std::vector<int> a = { 0 };
    std::vector<int> b = { 0 };
    double aa = findMedianSortedArrays(a, b);
    std::cout << aa << std::endl;
    system("pause");
    return 0;
}

执行用时: 72 ms, 在Median of Two Sorted Arrays的C++提交中击败了7.44% 的用户
内存消耗: 21.8 MB, 在Median of Two Sorted Arrays的C++提交中击败了0.53% 的用户

有点垃圾。。。

改进思想参考:https://blog.csdn.net/hang404/article/details/84786904

 

posted @ 2019-02-25 23:23  maitianpt  阅读(303)  评论(0编辑  收藏  举报