4. 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)).

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

Solution

(1) Java

注意(1)kth的意思是第k个,从1开始,不是从0开始;(2)每次除掉k/2 个或者如果有某个数组长度不到k/2,就比较它的最大元素和另一个数组的k/2-1元素的大小,把小的那部分去掉

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

    private int findKthNum(int[] nums1, int[] nums2, int kth, int start1, int start2) {
        if (start1 >= nums1.length) {
            return nums2[start2+kth-1];
        }
        if (start2 >= nums2.length) {
            return nums1[start1+kth-1];
        }
        if (kth == 1) {
            return Math.min(nums1[start1], nums2[start2]);
        }
        int len1 = nums1.length-start1;
        int len2 = nums2.length-start2;
        int key1 = Math.min(len1, kth/2);
        int key2 = Math.min(len2, kth/2);
        if (nums1[start1+key1-1] < nums2[start2+key2-1]) {
            return findKthNum(nums1, nums2, kth-key1, start1+key1, start2);
        } else {
            return findKthNum(nums1, nums2, kth-key2, start1, start2+key2);
        }
    }
}

(2) Python

I tried to cut half from list instead of k, but there are too many corner cases, so still stick to k/2, much more simpler code:

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        def findKth(nums1, nums2, k):
            if not nums1:
                return nums2[k-1]
            if not nums2:
                return nums1[k-1]
            if k == 1:
                return min(nums1[0], nums2[0])
            mid1, mid2 = min(len(nums1), k/2), min(len(nums2), k/2)
            return findKth(nums1[mid1:], nums2, k-mid1) if nums1[mid1-1] <= nums2[mid2-1] else findKth(nums1, nums2[mid2:], k-mid2)

        return (findKth(nums1, nums2, (len(nums1)+len(nums2)+1)/2)+findKth(nums1, nums2, (len(nums1)+len(nums2)+2)/2))/2.0

(3) Scala

object Solution {
    def findMedianSortedArrays(nums1: Array[Int], nums2: Array[Int]): Double = {
        val mid1 = (nums1.length+nums2.length+1)/2
        val mid2 = (nums1.length+nums2.length+2)/2
        val rst = (findKth(nums1, 0, nums2, 0, mid1)+findKth(nums1, 0, nums2, 0, mid2))/2.0
        return rst
    }

    def findKth(nums1: Array[Int], start1: Int, nums2: Array[Int], start2: Int, k: Int): Int = {
        if (start1 >= nums1.length) {
            return nums2{start2+k-1}
        }
        if (start2 >= nums2.length) {
            return nums1{start1+k-1}
        }
        if (k==1) {
            return Math.min(nums1{start1}, nums2{start2})
        }
        val half1 = Math.min(nums1.length-start1, k/2)
        val half2 = Math.min(nums2.length-start2, k/2)
        if (nums1{start1+half1-1} < nums2{start2+half2-1}) {
            return findKth(nums1, start1+half1, nums2, start2, k-half1)
        } else {
            return findKth(nums1, start1, nums2, start2+half2, k-half2)
        }
    }
}

results matching ""

    No results matching ""