Median of Two Sorted Arrays - LeetCode 4

题目描述:
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Tags: Divide and Conquer Array Binary Search

分析:
首先,中位数的定义是位于中间位置的元素,如果是偶数个元素,那么中位数就是中间两个元素的平均值。

看到时间复杂度要求,用归并就可以了。先归并排序,然后直接定位中间的元素,或中间两个元素,求出平均值即可。
当然,归并之前得判断是否两个数组都非空,若其中一个为空就不用归并了。

以下是实现代码:

/**44ms//*/
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        double mid = 0.0;
        int m = nums1.size();
        int n = nums2.size();
        int len = m + n;
        if(len == 0)
            return mid;

        if(n == 0 && m > 0){  //nums2为空,直接在nums1中找中位数
            if(m == 1)
                mid = (double)nums1[0];
            else if(m %2 == 0)
                mid = (nums1[m/2] + nums1[m/2 -1])/2.0;
            else
                mid = (double)nums1[m/2];
            return mid;
        }

        if(m == 0 && n > 0){  //nums1为空,直接在nums2中找中位数
            if(n == 1)
                mid = (double)nums2[0];
            else if(n %2 == 0)
                mid = (nums2[n/2] + nums2[n/2 -1])/2.0;
            else
                  mid = (double)nums2[n/2];
            return mid;
        }
        
        vector<int> vec;        
        int i = 0,j = 0;
        
        while(i < m && j < n){ //归并
            if(nums1[i] <= nums2[j]){
                vec.push_back(nums1[i]);
                i++;
            }
            else{
                vec.push_back(nums2[j]);
                j++;
            }
        }
        while(i < m){
            vec.push_back(nums1[i]);
            i++;
        }
        while(j < n){
            vec.push_back(nums2[j]);
            j++;
        }

        //在归并后的数组中找中位数
        if(len % 2){ 
            mid = (double)vec[len/2];
        }
        else{
            mid = (vec[len/2] + vec[len/2 -1])/2.0;
        }
        return mid;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值