1. 程式人生 > >【leetcode】4. Median of Two Sorted Arrays

【leetcode】4. Median of Two Sorted Arrays

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;
    }
}