LeetCode4. 寻找两个有序数组的中位数

Posted Alan_Fire

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode4. 寻找两个有序数组的中位数相关的知识,希望对你有一定的参考价值。

给定两个大小为 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


分析:给定两个有序的数组,求中位数,难度系数给的是 Hard,希望的复杂度是 log 级别。回顾下中位数,对于一个有序数组,如果数组长度是奇数,那么中位数就是中间那个值,如果长度是偶数,就是中间两个数的平均数。

二分查找:两个指针扫一下,每次选小的,找到第mid个,就是中位数。

技术分享图片
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int length1 = nums1.size();
        int length2 = nums2.size();
        int mid = (length1+length2)/2;
        int s = 0;
        int l = 0;
        int r = 0;
        int now = 0;
        int pre = 0;
        while(s<=mid && l<length1 && r<length2){
            pre = now;
            if(nums1[l]<nums2[r]){
                now = nums1[l];
                l++;
            }else{
                now = nums2[r];
                r++;
            }
            s++;
        }
        while(s<=mid && l<length1){
            pre = now;
            now = nums1[l];
            l++;
            s++;
        }
         while(s<=mid && r<length2){
            pre = now;
            now = nums2[r];
            r++;
            s++;
        }
        if((length1+length2)!=mid*2){
            return now;
        }else{
            return 1.0*(now+pre)/2;
        }
    }
};
View Code

 








以上是关于LeetCode4. 寻找两个有序数组的中位数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode4:两个排序数组的中位数

二分 - 寻找两个有序数组的中位数 - Leetcode 4

LeetCode4. 寻找两个正序数组的中位数(C++)

LeetCode4. 寻找两个正序数组的中位数

LeetCode4. 寻找两个正序数组的中位数

每日算法/刷穿 LeetCode4. 寻找两个正序数组的中位数(困难)