leetcode4. Median of Two Sorted Arrays(求两个排序数组的中位数)

116 篇文章 2 订阅
94 篇文章 0 订阅

题目大意:已知两个排好序的数组nums1和nums2,长度分别为m和n,要求的是合并nums1和nums2之后的所有数的中位数。时间复杂度要求O(log(m+n))

题目分析:容易想到的是归并排序算法,用两个指针分别指向nums1和nums2,分别比较两个指针所指向的元素的大小,哪个小,哪个就往后移,直到两个指针都指向了数组的末尾。AC

代码展示:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result;
        vector<int>::iterator it1 = nums1.begin();
        vector<int>::iterator it2 = nums2.begin();
        while(it1!=nums1.end() || it2!=nums2.end()){
            if(it1==nums1.end()){
                result.insert(result.end(),it2,nums2.end());
                break;
            }
            if(it2==nums2.end()){
                result.insert(result.end(),it1,nums1.end());
                break;
            }
            if(*it1==*it2){
                result.push_back(*it1);
                result.push_back(*it2);
                it1++;
                it2++;
            }
            else if(*it1>*it2){
                result.push_back(*it2);
                it2++;
            }
            else{
                result.push_back(*it1);
                it1++;
            }
        }
        int len = result.size();
        if(len%2)
            return double(result[len/2]);
        else
            return double((result[len/2-1]+result[len/2])/2.0);
    }
};

另一种比较高效的做法是,求解两个数组的中位数nums1[middle1], nums2[middle2],比较它们的大小,会存在以下三种关系:

1.nums1[middle1]>nums2[middle2], 则排除nums1中排在middle1之后的元素,排除nums2中排在middle2之前的元素

2.nums1[middle1]=nums2[middle2],则返回nums1[middle1]或nums2[middle2]为最终的结果

3.nums1[middle1]<nums2[middle2],则排除nums1中排在middle1之前的元素,排除nums2中排在middle2之后的元素

这样递归下去即可。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值