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

题目大意:已知两个排好序的数组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之后的元素

这样递归下去即可。


猜你喜欢

转载自blog.csdn.net/jaster_wisdom/article/details/79886922