【LeetCode】解题4:Median of Two Sorted Arrays

Problem 4: Median of Two Sorted Arrays [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)).

You may assume nums1 and nums2 cannot be both empty.

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

来源:LeetCode

解题思路

中位数可以转化为寻找一个数组中的第K小的数或是第K小和第K+1小的数的平均值。
如下图数组1长度为4,数组2长度为10,则中位数为第7小和第8小数之和除以2。
考虑获取第7小数的情况:比较两个数组第k/2小数(即第3小数)的值,更小的一方可以直接去掉3个数(1,2,3),剩下的数(1,3,4,9,4,5,6,7,8,9,10)可以递归寻找第4(7-3=4)小数。
在这里插入图片描述
图源:LeetCode题解

每一轮递归可去掉k/2个数,因此时间复杂度为O(log k),而k=(m+n)/2,因此可保证题目要求复杂度O(log (m+n))。

要点:递归二分法

Solution (Java)

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        if((m+n)%2 == 1){
            return findKnum(nums1, 0, m-1, nums2, 0, n-1, (m+n)/2+1);
        }
        else{
            return (findKnum(nums1, 0, m-1, nums2, 0, n-1, (m+n)/2) + findKnum(nums1, 0, m-1, nums2, 0, n-1, (m+n)/2+1))/2;
        }
    }
    private double findKnum(int[] nums1, int l1, int r1, int[] nums2, int l2, int r2, int k) {
        int len1 = r1 - l1 + 1;
        int len2 = r2 - l2 + 1;
        if(len1 > len2) return findKnum(nums2, l2, r2, nums1, l1, r1, k);

        if(len1 == 0) return nums2[l2 + k-1];
        if(k == 1) return Math.min(nums1[l1], nums2[l2]);
        int index1 = Math.min(r1, l1 + k/2-1);
        int index2 = l2 + k/2-1;
        if(nums1[index1] < nums2[index2]){
            k = k - (index1 - l1 + 1);
            return findKnum(nums1, index1+1, r1, nums2, l2, r2, k);
        }
        else{
            k = k - (index2 - l2 + 1);
            return findKnum(nums1, l1, r1, nums2, index2+1, r2, k);
        }
    }
}

修改过程

  • 考虑len1>len2的情况下调换数组顺序,便于后续保证只有数组1才有个数为0或个数小于k/2的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值