Leetcode 4. Median of Two Sorted Arrays[Hard]

来源:互联网 发布:编程语言历史发展 编辑:程序博客网 时间:2024/06/14 19:46

原题地址

题目内容

这里写图片描述

题目分析

看到题目第一眼想到的就是采用merge的做法,将两个数列从第一个开始比较排序,不过这样的做法复杂度就变为O(n),不符合题目的要求。后面参考了leetcode上面的discuss以及别人的博客,就采用了分治的做法,主要思想就是求数列中第k大的数。

举个例子
这里写图片描述

代码实现

double getkth(int* nums1, int size1, int* nums2, int size2,int k){    if(size1 == 0){        return nums2[k-1];    }    if(size2 == 0){        return nums1[k-1];    }    if(k == 1){        return nums1[0]<nums2[0]?nums1[0]:nums2[0];    }    int i = size1<(k/2)?size1:(k/2);    int j = size2<(k/2)?size2:(k/2);    if(nums1[i-1] > nums2[j-1]){        return getkth(nums1,size1,nums2+j,size2-j,k-j);    }    else return getkth(nums1+i,size1-i,nums2,size2,k-i);}double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {    int tot = nums1Size + nums2Size;    if(tot % 2 == 0){        return (getkth(nums1, nums1Size, nums2, nums2Size,tot/2)+getkth(nums1,nums1Size,nums2,nums2Size,tot/2+1))/2.0;    }else{        return getkth(nums1, nums1Size, nums2, nums2Size,tot/2+1);    }}