关闭

Leetcode|【4】Median of Two Sorted Arrays

标签: leetcode
176人阅读 评论(0) 收藏 举报
分类:

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)).

这题不简单,通用的方法是写出一个找到两个数组第K大的函数。这个拓展性更好!
这里我设定K从0取值。第0大的就是两个数组最小的数。
如果两数组的元素和是偶数,那么取最中间的两个数的平均值。

找到第K大的数的分析:分别在a和b数组中找出第k/2大的数(考虑a数组长度小于等于b的长度,且可能小于k/2);
如果a[k/2]

int findKth(vector<int>& nums1,int s1,vector<int>& nums2,int s2,int k){//nums1的有效长度假设比较小。
        if(nums1.size()-s1>nums2.size()-s2) return findKth(nums2,s2,nums1,s1,k);
        if(nums1.size()-s1==0) return nums2[s2+k];
        if(k==0) return nums1[s1]<nums2[s2]?nums1[s1]:nums2[s2];
        int p1=k/2<nums1.size()-s1-1?k/2:nums1.size()-s1-1;//防止nums1太短
        int p2=k-p1-1;
        if(nums1[s1+p1]<nums2[s2+p2]) return findKth(nums1,s1+p1+1,nums2,s2,k-p1-1);
        else if(nums1[s1+p1]>nums2[s2+p2]) return findKth(nums1,s1,nums2,s2+p2+1,k-p2-1);
        else return nums1[s1+p1];
    }

    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int total=nums1.size()+nums2.size();
        if(total&1){
            return findKth(nums1,0,nums2,0,total/2);
        }else{
            return ((double)findKth(nums1,0,nums2,0,total/2-1)+(double)findKth(nums1,0,nums2,0,total/2))/2;
        }

    }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8269次
    • 积分:603
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:4篇
    • 译文:3篇
    • 评论:0条
    文章分类