leetcode-----4. 寻找两个正序数组的中位数

思路

将该问题转换为求第(m + n) / 2小的数即为中位数。
1.假设m和n均大于k / 2,则各取前k / 2个元素。
若nums1[k / 2 - 1] > nums2[k / 2 - 1],则表示nums1中的元素过多,nums2中的元素过少;则nums2中的前k / 2个元素小于等于第k小的数,则将问题转换为在剩下的数中找k - k / 2小数。反之同理。
2.若m < k / 2,则从nums1中去出m个元素,从nums2中取出k / 2个元素。
若nums1[m - 1] > nums2[k / 2 - 1],则表示nums2中的前k / 2个元素都小于等于第k小数,则将问题转换为在剩下的数中找k - k / 2小数。
若nums1[m - 1] <= nums2[k / 2 - 1],则表示nums1中的所有元素都小于等于第k小数,则第k小数为nums2[k - m - 1]。

代码

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int total = nums1.length + nums2.length;
        if (total % 2 == 0) {
            int left = findKthElement(nums1, 0, nums2, 0, total / 2);
            int right = findKthElement(nums1, 0, nums2, 0, total / 2 + 1);
            return (left + right) / 2.0;
        } else {
            return findKthElement(nums1, 0, nums2, 0, total / 2 + 1);
        }
    }

    int findKthElement(int[] nums1, int i, int[] nums2, int j, int k) {
        if (nums1.length - i > nums2.length - j) return findKthElement(nums2, j, nums1, i, k);
        if (nums1.length == i) return nums2[j + k - 1];
        if (k == 1) return Math.min(nums1[i], nums2[j]);
        int si = Math.min(i + k / 2, (int)nums1.length);
        int sj = j + k / 2;
        if (nums1[si - 1] > nums2[sj - 1]) {
            return findKthElement(nums1, i, nums2, j + k / 2, k - k / 2);
        } else {
            return findKthElement(nums1, si, nums2, j, k - (si - i));
        }
    }
}
原文地址:https://www.cnblogs.com/clown9804/p/13027932.html