zoukankan      html  css  js  c++  java
  • #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

  • 相关阅读:
    算法训练 区间k大数查询
    算法训练 最大最小公倍数
    身份证号码升级
    python包与模块导入
    python函数
    HDU 3595 博弈论,被支配的恐惧
    BZOJ 3195 [Jxoi2012]奇怪的道路
    大暑假集训
    [Poi2010]Monotonicity 2
    BZOJ 4868 HEOI 期末考试
  • 原文地址:https://www.cnblogs.com/biat/p/10434602.html
Copyright © 2011-2022 走看看