LeetCoder_____Median of Two Sorted Arrays

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

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

题意:

给出两个递增序列,求该两个递增序列合并后的中位数。


我的答案:

第一次做的时候,其实跟最佳答案很相近了。

对左边数组进行二分,找到二分位置的数字,然后用二分查找到右边数组查找这个数字的位置,然后判断两边元素个数是否相等。


最佳答案:


为了做这道题,我们需要去理解“中位数”. 在统计中, 在统计,中位数是用来将一组分成两个相等的长度子集,

其中一个子集每个元素总是大于等于另一个子集元素。如果我们理解的使用值划分,我们非常接近答案。

首先我让A根据一个随机位置i来分成两个部分。

      left_A             |        right_A
A[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]

因为有m个元素,所以有m + 1种(i = 0 ~ m)。我们知道:len(left_A)=i,len(right_A)= m - i。

注意:当i= 0,left_A是空的,当i= m,right_A是空的。

同样的方法,我让B根据一个随机位置j来分成两个部分

      left_B             |        right_B
B[0], B[1], ..., B[j-1]  |  B[j], B[j+1], ..., B[n-1]

把left_A,left_B为一组,把right_A,right_B到另一组,我们的名字他们left_part,right_part:

      left_part          |        right_part
A[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]
B[0], B[1], ..., B[j-1]  |  B[j], B[j+1], ..., B[n-1]

如果我们可以保证:

1) len(left_part) == len(right_part)
2) max(left_part) <= min(right_part)

然后我们把所有元素以同样的长度分成两个部分进入left_part,right_part,然后其中一个part始终要大于等于另一个。

然后,median = (max(left_part) + min(right_part))/2.

为了确保这两个条件,我们只需要确保:

(1) i + j == m - i + n - j (or: m - i + n - j + 1)
    if n >= m, we just need to set: i = 0 ~ m, j = (m + n + 1)/2 - i
(2) B[j-1] <= A[i] and A[i-1] <= B[j]

细节不予多说了。

注意:part存在空集的情况。



代码:

class Solution {
public:

    double findMedianSortedArrays(vector<int> nums1, vector<int> nums2) {
        int num = (nums1.size() + nums2.size() + 1) / 2;
        if(nums1.size() > nums2.size()) nums1.swap(nums2);
        if(nums1.size() == 0 && nums2.size() == 1) return nums2[0];
        int num1 = nums1.size(),num2 = nums2.size();
        int l = 0,r = nums1.size(),mid;
        int mx,mi;
        while(l<=r)
        {
            mid = (l+r)/2;
            int rest = num - mid;
            if(rest < 0){
                r = mid - 1;continue;
            }else if(rest > num2){
                l = mid + 1;continue;
            }

            if(mid != 0 && rest == 0) mx = nums1[mid-1];
            else if(mid == 0 && rest != 0) mx = nums2[rest-1];
            else mx = max(nums1[mid-1],nums2[rest-1]);

            if(mid != num1 && rest == num2) mi = nums1[mid];
            else if(mid == num1 && rest != num2) mi = nums2[rest];
            else mi = min(nums1[mid],nums2[rest]);
            if(mx <= mi){
                l = mid;
                break ;
            }
            if(mid == 0){
                l = mid + 1;
            }else if(rest == 0){
                r = mid - 1;
            }else{
                if(mx == nums1[mid-1])
                    r = mid - 1;
                else
                    l = mid + 1;
            }
        }
        if((num1+num2)%2){
            return mx;
        }else{
            return (mi+mx)/2.0;
        }
    }
};






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值