【leetcode】4. Median of Two Sorted Arrays

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tianxieeryang/article/details/85761317

4. Median of Two Sorted Arrays

Problem

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

Solution

1、python (108ms)

class Solution(object):
    def findKth(self, nums1, nums2, k):
        len1 = len(nums1)
        len2 = len(nums2)
        if len2 < len1:              # promise len1 < len2
            return self.findKth(nums2, nums1, k)
        if len1 == 0:
            return nums2[k - 1]
        if k == 1:                   # output
            return min([nums1[0], nums2[0]])
        p1 = min(k/2, len1)
        p2 = k - p1
        if nums1[p1 - 1] <= nums2[p2 - 1]:
            return self.findKth(nums1[p1:], nums2, p2)    # desert before p1 in num1
        else:
            return self.findKth(nums1, nums2[p2:], p1)
        
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        lennums1 = len(nums1)
        lennums2 = len(nums2)
        if (lennums1 + lennums2) % 2 == 1:
            return self.findKth(nums1, nums2, (lennums1 + lennums2)/2 + 1)
        else:
            return (self.findKth(nums1, nums2, (lennums1 + lennums2)/2) + self.findKth(nums1, nums2, (lennums1 + lennums2)/2 + 1))/2.0

2、C (36ms)

int findKth(int *nums1, int num1, int *nums2, int num2, int k) {
    if (num1 > num2) {
        return findKth(nums2, num2, nums1, num1, k);
    }
    if (num1 == 0) {
        return *(nums2 + k -1);
    }
    if (k == 1) {
        return *nums1 <= *nums2 ? *nums1 : *nums2;
    }
    int p1 = k/2 <= num1 ? k/2 : num1;
    int p2 = k - p1;
    if (*(nums1 + p1 - 1) <= *(nums2 + p2 - 1)) {
        return findKth(nums1 + p1, num1 - p1, nums2, num2, p2);
    } else {
        return findKth(nums1, num1, nums2 + p2, num2 - p2, p1);
    }
}

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    if ((nums1Size + nums2Size) % 2 == 1) {
        return findKth(nums1, nums1Size, nums2, nums2Size, (nums1Size + nums2Size)/2 + 1);
    } else {
        return (findKth(nums1, nums1Size, nums2, nums2Size, (nums1Size + nums2Size)/2) + findKth(nums1, nums1Size, nums2, nums2Size, (nums1Size + nums2Size)/2 + 1)) / 2.0;
    }
}

猜你喜欢

转载自blog.csdn.net/tianxieeryang/article/details/85761317
今日推荐