Leetcode04

2018/10/25 算法题

Leetcode04

问题:求两个以排序序列的中位数。 为了更好的运用分治,将问题转化为求第k小的数。 转化后:两个长度分别为m,n的有序序列,如果m+n为偶数,求第(m+n)/2小的数和第(m+n)/2+1小的数的平均数;否则求第(m+n)/2+1小的数。 首先处理递归边界和特殊情况:

假设第一个序列vec1的长度小于第二个序列vec2,如果不是这样,就调换位置重新递归。 如果第一个序列vec1为空,那么直接返回第二个序列的第k小的数。 如果k为1,也就是求最小的数,那么直接返回vec1[0],vec2[0]中小的那个。

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int k=nums1.size()+nums2.size();
        if(k%2==0)
            return (median(nums1,nums2,k/2)+median(nums1,nums2,k/2+1))/2.0;
        else return median(nums1,nums2,k/2+1);
    }
double median(vector<int>& vec1,vector<int>& vec2,int k){
        if(vec1.size()>vec2.size()) return median(vec2,vec1,k);
        if(vec1.empty()) return vec2[k-1];
        if(k==1) return min(vec1[0],vec2[0]);
        int p1=vec1.size()>k/2?k/2:vec1.size();
        int p2=k-p1;
        if(vec1[p1-1]>vec2[p2-1]){
            vector<int> vec(vec2.begin()+p2,vec2.end());
            return median(vec1,vec,k-p2);
        }
        else if(vec1[p1-1]<vec2[p2-1]){
            vector<int> vec(vec1.begin()+p1,vec1.end());
            return median(vec,vec2,k-p1);
        }
        else return vec1[p1-1];
    }


Search

    Table of Contents

    本站总访问量