来自: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_x
和partition_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?
答案 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链接上测试了这个,没有任何运行时错误。希望这有帮助