LeetCode [Median of Two Sorted Arrays]

Problem:4. Median of Two Sorted Arrays

Question

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

思路

  1. 最简单的思路当然是,直接将给定的两个数组组合起来,然后排序一次(毕竟排序可以做到log(m+n)),这样一来,中位数就等于中间两数的平均数或者是中间数了嘛。
  2. 另外一种思路,在这两个数组的基础上,划分成两个长度大小的数组,然后找到中位数。

具体可以看以下的例子:

A:
       1 3 5 | 7 9
index: 0 1 2   3 4

B:
       2 4 | 6 8 10
index: 0 1   2 3 4

中间的 | 代表分割。将数组A和数组B从竖线处分开,两数组左边的部分组成一个新数组,右边组成一个新数组,长度相同。

     左   |   右
   1 3 5     7 9
   2 4       6 8 10

同时满足性质:

A[2] = 5 < B[2] = 6
B[1] = 4 < A[3] = 7

我们把被分割的位置设为 i,j,满足条件:

A[i-1] < B[j]
B[j-1] < A[i]
(i,j != 0, i,j != m, n)

i = 0 时,满足 B[j-1] < A[i]
j = 0 时,满足 A[i-1] < B[j]
i = m 时,满足 A[i-1] < B[j]
j = m 时,满足 B[j-1] < A[i]

代码

简单版:

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        ary = nums1 + nums2;
        ary.sort();
        size = len(ary)
        if len(ary) % 2 == 0:
            return (ary[size/2] + ary[(size-1)/2]) / 2.0;
        else:
            return ary[size/2];

复杂一点:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        std::vector<int> A = (nums1.size() > nums2.size() ? nums2 : nums1);
        std::vector<int> B = (nums1.size() > nums2.size() ? nums1 : nums2);
        int m = A.size();
        int n = B.size();
        int imin = 0, imax = m, i, j;
        while (imin<=imax) {
            i = (imin + imax) / 2;
            j = (m+n+1)/2 - i;
            if (i < imax && B[j-1] > A[i]) {
                imin = imin+1;
            }
            else if (i > imin && A[i-1] > B[j]) {
                imax = imax-1;
            }
            else {
                int maxleft = 0;
                if (i == 0) maxleft = B[j-1];
                else if (j == 0) maxleft = A[i-1];
                else maxleft = max(A[i-1], B[j-1]);

                int minright = 0;
                if (i == m) minright = B[j];
                else if (j == n) minright = A[i];
                else minright = min(A[i], B[j]);

                if ((m+n)%2 == 1) return maxleft;
                else return (maxleft + minright) / 2.0;
            }
        }
        return 0.0;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值