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

269 阅读1分钟

GitHub-LT-03-源码 :large_blue_diamond:归并

问题描述

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。 请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

解法1: 归并可以解 但复杂度不符合log(m+n)

  • 执行用时:28 ms, 在所有 C++ 提交中击败了22.02%的用户
  • 内存消耗:8.2 MB, 在所有 C++ 提交中击败了100.00%的用户

算法复杂度 O(n+m) 取决于最长的数组的长度

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        //* 合并两个数组 因为两个数组都是有序的,所以可以进行merge ==> 类似两个牌堆
        //* 然后看两个数组的大小,如果是偶数,那么就是中间两个数之和的一半
        //* 否则就是中间的数

        //*merge
        vector<int> result;
        int num1_size = nums1.size();
        int num2_size = nums2.size();
        int i = 0, j = 0;
        while (i<num1_size && j<num2_size) {
            if (nums1[i] < nums2[j]) {
                result.push_back(nums1[i]);
                i++;
            }
            else {
                result.push_back(nums2[j]);
                j++;
            }
        }
        while (i<num1_size) {
            result.push_back(nums1[i]);
            i++;
        }
        while (j < num2_size) {
            result.push_back(nums2[j]);
            j++;
        }
        if (result.size() % 2 == 0) {
            return (result[result.size() / 2-1] + result[result.size() / 2])/2.0;
        }
        else {
            return result[result.size() / 2.0];
        }
    }
};

寻找两个有序数组的第K小元素

没理解



:triangular_flag_on_post: TODO

  • :question: log(n+m)求两个有序数组的第K大元素