【LeetCode】 4. Median of Two Sorted Arrays 寻找两个有序数组的中位数(Hard)(JAVA)

【LeetCode】 4. Median of Two Sorted Arrays 寻找两个有序数组的中位数(Hard)(JAVA)

题目地址: https://leetcode.com/problems/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)).

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

题目大意

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

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

你可以假设 nums1 和 nums2 不会同时为空。

解题方法

1、题目里面已经要求算法的时间复杂度为 O(log (m+n)),说明肯定是要用二分法;
2、要算出有序数组 m 和 n 的中位数,其实就是要在找出第 (m + n) / 2位的数和 (m + n) / 2 + 1位的数;
3、问题就可以简化为找出序数组 m 和 n 的第 k 位数;
4、其实只要比较 num1[m - k / 2] 和 num2[n - k / 2] 的大小(先不考虑数组越界);如果 num1[m - k / 2] 大,说明 num2[n - k / 2] 肯定在第 k 位之前,所以只要在 num2[n - k / 2] ~ num2[n - 1] 和 num1[0] ~ num1[m - 1] 中找出第 k / 2 位即可;这样就去掉了一半,用的就是二分原则;其他的只要考虑清楚边界条件即可。

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len = nums1.length + nums2.length;
        if (len % 2 == 0) {
            return (fH(nums1, nums2, 0, 0, len / 2) + fH(nums1, nums2, 0, 0, len / 2 + 1)) / 2.0;
        }
        return fH(nums1, nums2, 0, 0, len / 2 + 1) * 1.0;
    }

    public int fH(int[] nums1, int[] nums2, int start1, int start2, int k) {
            if (start1 >= nums1.length) {
                return nums2[start2 + k - 1];
            }
            if (start2 >= nums2.length) {
                return nums1[start1 + k - 1];
            }
        if (k == 1) {
            return nums1[start1] > nums2[start2] ? nums2[start2] : nums1[start1];
        }
        int mid = k / 2;
        int index1 = start1 + mid - 1 >= nums1.length ? nums1.length - 1 : start1 + mid - 1;
        int index2 = start2 + mid - 1 >= nums2.length ? nums2.length - 1 : start2 + mid - 1;
        if (nums1[index1] >= nums2[index2]) {
            return fH(nums1, nums2, start1, index2 + 1, k - (index2 - start2 + 1));
        } else {
            return fH(nums1, nums2, index1 + 1, start2, k - (index1 - start1 + 1));
        }
    }
}

执行用时 : 2 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 : 42 MB, 在所有 Java 提交中击败了96.59%的用户

发布了29 篇原创文章 · 获赞 3 · 访问量 1116

猜你喜欢

转载自blog.csdn.net/qq_16927853/article/details/104505062