leetcode-4-Median of Two Sorted Arrays

来源:互联网 发布:免费下载绘图软件 编辑:程序博客网 时间:2024/06/08 08:24

难度

hard

描述

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

示例

nums1 = [1, 3]nums2 = [2]The median is 2.0nums1 = [1, 2]nums2 = [3, 4]The median is (2 + 3)/2 = 2.5

我的代码

class Solution {public:     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {        int i = 0,j = 0;        vector<int> temp;        while(i < nums1.size() && j < nums2.size())        {            if(nums1[i] <= nums2[j])            {                temp.push_back(nums1[i]);                i++;            }            else            {                temp.push_back(nums2[j]);                j++;            }        }        while(i < nums1.size())        {            temp.push_back(nums1[i]);            i++;        }        while(j < nums2.size())        {            temp.push_back(nums2[j]);            j++;        }        int num = nums2.size() + nums1.size();        bool flag = num%2==0?true:false;        double medium = 0;        num = (num - 1) / 2.0;        if(flag)            medium =  (temp[num] + temp[num+1])/2.0;        else            medium = temp[num];        return medium;    }};

我的主要思想就是先归并两个有序的表,然后在找medium数。空间复杂度O(m+n)

更优解

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {    int N1 = nums1.size();    int N2 = nums2.size();    if (N1 < N2) return findMedianSortedArrays(nums2, nums1);//保存左边比右边个数多    if (N2 == 0) return ((double)nums1[(N1-1)/2] + (double)nums1[N1/2])/2; //元素数据小的链表为零时     int lo = 0, hi = N2 * 2;    while (lo <= hi) {        int mid2 = (lo + hi) / 2;    //获取分割点         int mid1 = N1 + N2 - mid2;          double L1 = (mid1 == 0) ? INT_MIN : nums1[(mid1-1)/2];          double L2 = (mid2 == 0) ? INT_MIN : nums2[(mid2-1)/2];        double R1 = (mid1 == N1 * 2) ? INT_MAX : nums1[(mid1)/2];        double R2 = (mid2 == N2 * 2) ? INT_MAX : nums2[(mid2)/2];        if (L1 > R2) lo = mid2 + 1;  //链表必须满足l1<R2,l2<R1            else if (L2 > R1) hi = mid2 - 1;            else return (max(L1,L2) + min(R1, R2)) / 2;    }    return -1;} 

这个算法的实现内部有点二分查找的意思。比较难理解。主要的思想就是找到两个数l,r,这个两个数把左右分割。例如

1,2,3,4,51,1,1,1

假如 mid2 = 2, 所以可以得到mid1 = 4 + 5 - mid2 = 7.分割成:

[1 2 3 (4/4) 5 ]     [1/1 1 1 ]  

所以l1=4,R1=4,l2=1,R2=1.
最终我们需要满足的条件是:L1 < R1 && L1 < R2 && L2 < R1 && L2 < R2.
因为链表为有序表,所以L1 < R1以及L2 < R2是始终满足的。所以只要满足L1 < R2 && L2 < R1即可。
最终需要的值就是: (max(L1,L2)+min(R1,R2))/2
当一个链表为空时:

N        Index of L / R1               0 / 02               0 / 13               1 / 1  4               1 / 2      5               2 / 26               2 / 37               3 / 38               3 / 4

我们可以总结出: L = (N-1)/2, R = N/2。

原创粉丝点击