6.21 - hard - 1

4. Median of Two Sorted Arrays

这题基本想法是扔一半,比如说取第k大的数,那么则比较nums1[k/2-1] 和nums2[k/2-1] 例如 nums1[k/2]这个值比较大,则说明第k大的数肯定不再nums2的 0 ~ k/2-1的这个范围内,全部扔掉。这时候再递归的时候nums2 从 0 + k/2开始计数,而k的值也相应的缩小为 k - k/2。最tricky的地方,也是我花了一些时间的地方,就是到底从哪里开始计数,扔掉多少,新的pointer更新为多少,k一定要从1开始count,否则不太好做。

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        # 和kth largest number in two sorted array 类似
        l = len(nums1) + len(nums2)
        if l % 2 != 0:
            return self.kth(nums1, nums2, 0, 0, l/2+1)
        else:
            return (self.kth(nums1, nums2, 0, 0, l/2) + self.kth(nums1, nums2, 0, 0, l/2+1)) / 2.0
    
    def kth(self, nums1, nums2, p1, p2, k): 
        """ find kth element """
        # k is kth element counting from 1
        if p1 >= len(nums1):
            return nums2[p2+k-1]
        if p2 >= len(nums2):
            return nums1[p1+k-1]
        
        if k == 1:
            return min(nums1[p1], nums2[p2])
        
        if p1+k/2-1 >= len(nums1):
            cur1 = sys.maxint
        else:
            cur1 = nums1[p1+k/2-1]
        
        if p2+k/2-1 >= len(nums2):
            cur2 = sys.maxint
        else:
            cur2 = nums2[p2+k/2-1]
        
        if cur1 > cur2:
            return self.kth(nums1, nums2, p1, p2+k/2, k - k/2)
        else:
            return self.kth(nums1, nums2, p1+k/2, p2, k - k/2)

你可能感兴趣的:(6.21 - hard - 1)