在两个排序列表的中位数中计算相对分区

时间:2018-05-31 04:24:58

标签: python algorithm

来自:https://leetcode.com/problems/median-of-two-sorted-arrays/description/

  

有两个排序的数组nums1和nums2,大小为m和n   分别

     

找出两个排序数组的中位数。整体运行时间   复杂度应为O(log(m + n))。

     

示例1:

nums1 = [1, 3]
nums2 = [2]
     

中位数为2.0

Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
     

中位数为(2 + 3)/ 2 = 2.5

我有以下解决方案(基于此YouTube视频:https://www.youtube.com/watch?v=LPFhl65R7ww):

class Solution:
    def findMedianSortedArrays(self, x, y):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        x, y = (x, y) if len(x) <= len(y) else (y, x)
        total_len_even = (len(x) + len(y)) % 2 == 0
        left, right = 0, len(x)
        while left <= right:
            partition_x = (left + right) // 2
            # not sure why we add 1 below...
            half_el_count = (len(x) + len(y) + 1) // 2
            partition_y = half_el_count - partition_x 

            max_left_x = float('-inf') if partition_x == 0 else x[partition_x - 1]
            min_right_x = float('inf') if partition_x == len(x) else x[partition_x]

            max_left_y = float('-inf') if partition_y == 0 else y[partition_y - 1]
            min_right_y = float('inf') if partition_y == len(y) else y[partition_y]

            if max_left_x <= min_right_y and max_left_y <= min_right_x:
                return (max(max_left_x, max_left_y) + min(min_right_x, min_right_y)) / 2.0 if total_len_even else float(max(max_left_x, max_left_y))
            elif max_left_x > min_right_y:
                right = partition_x - 1
            else:
                left = partition_x + 1

其中partition_xpartition_y表示此分区索引之前的所有元素都小于或等于整体中位数。

我的问题围绕着这一行: half_el_count = (len(x) + len(y) + 1) // 2 我们想要找到分区y,如果你取组合列表中的元素总数,分区前的元素数x +分区y前的元素数是元素总数的一半(因为我们毕竟,试图找到中位数。

但是,half_el_count不应该是:(len(x) + len(y)) // 2?在视频中,他提到添加1可以更容易处理偶数或奇数情况,但我不确定这意味着什么。

Leetcode解决方案也说: i+j=m−i+n−j (or: m - i + n - j + 1m−i+n−j+1)未指定添加额外1的原因。有人可以解释为什么我们添加额外的1?

1 个答案:

答案 0 :(得分:0)

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        a=nums1+nums2
        a.sort()
        n=len(a)
        if len(a)==0 or len(a)==1:
            return a[0]
        if n%2!=0:
            s=(n/2)
            return a[s]
        else:
            return (a[n/2]+a[(n/2)-1])/2.0

我在你提供的leetcode链接上测试了这个,没有任何运行时错误。希望这有帮助