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

思路
求奇数个数字的中位数,(size1 + size2 + 1) / 2)=(size1 + size2 + 2) / 2)。
求奇数个数字的中位数,(size1 + size2 + 1) / 2)为二分点的前一个数,(size1 + size2 + 2) / 2)为二分点的后一个数。
例如
一共五个数, 则需要从小到大搜索,搜索到第三个数必然为中位数。
一共六个数, 则需要分别搜索第三个和第四个数,两数求和为中位数。
程序中的mid可以理解为中位数所在的位置,也可理解为需要搜索的次数,并且逐步减1.

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
    {
        int size1 = nums1.size(), size2 = nums2.size();
        auto mid1 = findMid(nums1, nums2, (size1 + size2 + 1) / 2);
        auto mid2 = findMid(nums1, nums2, (size1 + size2 + 2) / 2);
        return (mid1 + mid2) / 2;
    }
    double findMid(vector<int>& nums1, vector<int>& nums2, int mid)
    {
        int size1 = nums1.size(), size2 = nums2.size();
        int b1 = 0, b2 = 0, value = 0;
        while (mid--)
        {
            if (b1 == size1)
                return nums2[b2 + mid];
            if (b2 == size2)
                return nums1[b1 + mid];
            else if (b1 < size1 && b2 < size2)
            {
                value = nums1[b1] < nums2[b2] ? nums1[b1++] : nums2[b2++];
            }
        }
        return value;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容