LeetCode-4.两个排序数组的中位数(考察点:递归)

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。

请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。

你可以假设 nums1 和 nums2 均不为空。

示例 1:

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

中位数是 2.0

示例 2:

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

中位数是 (2 + 3)/2 = 2.5

解题思路:实现一个函数,找到两个有序数组的第K个元素

找到两个有序数组的第K个元素:

a数组分为【A1={a0...a(an-2)}】,【a(an-1)】,【A2={a(an)...}】

b数组分为【B1={b0...b(bn-2)}】,【b(bn-1)】,【B2={b(bn)...}】

始终保持A1,a(an-1),b(bn-1),B1个数为k

若a(an-1)==b(bn-1),A1B1<{a(an-1),b(bn-1)},则第K个元素是a(an-1)/b(bn-1);

若a(an-1)>b(bn-1),则an应该左移,可排除a(an-1)和A2,由于始终保持A1,a(an-1),b(bn-1),B1个数为k,相当于bn右移,即在a数组和B2中搜索第k-bn个元素;

若a(an-1)<b(bn-1),则an右移,即在A2和b数组中搜索第k-an个元素

java代码:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int k = nums1.length + nums2.length;
        if(0 != (k & 1)){
            return findK(nums1, 0, nums2, 0, k/2+1);
        } else {
            return (findK(nums1, 0, nums2, 0, k/2) + findK(nums1, 0, nums2, 0, k/2+1))/2.0;
        }
    }

    private int findK(int[] nums1, int s1, int[] nums2, int s2, int k){
        if(nums1.length - s1 > nums2.length - s2) {
            return findK(nums2, s2, nums1, s1, k);
        }
        if(s1 == nums1.length) {
            return nums2[k + s2 -1];
        }
        if(1 == k) return Math.min(nums1[s1], nums2[s2]);

        int an = Math.min(k/2, nums1.length), bn = k - an;
        if(nums1[s1 + an - 1] == nums2[s2 + bn - 1])
            return nums1[s1 + an -1];
        if(nums1[s1 + an - 1] > nums2[s2 + bn - 1])
            return findK(nums1, s1, nums2, s2+bn, k-bn);
        else
            return findK(nums1, s1+an, nums2, s2, k-an);
    }
}   

猜你喜欢

转载自blog.csdn.net/weixin_38823568/article/details/81329683