• #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

  • 相关阅读:
    CodeForces
    CodeForces-1253B(贪心+模拟)
    WebFlux、Reactive编程特性
    redis-on-windows配置解释
    SpringBoot配置方式补充
    如何在 Ubuntu 20.04 上安装 Python Pip
    MySQL之1055错误
    CuckooSandbox
    Manjaro 20.0.1 Lysia 安装Googlepinyin
    Manjaro 20.0.1 Lysia 更新国内镜像源
  • 原文地址:https://www.cnblogs.com/biat/p/10434602.html
Copyright © 2020-2023  润新知