時間複雜度為: o(log(m , n))
# -*- coding: utf-8 -*-
"""給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設 nums1 和 nums2 不會同時為空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
則中位數是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
@author: xiaozuo
"""# left_a | right_a
# a[0], a[1], ..., a[i-1] | a[i], a[i+1], ..., a[m-1]
# i m-i
# left_b | right_b
# b[0], b[1], ..., b[j-1] | b[j], b[j+1], ..., b[n-1]
# j n-j
# left_part | right_part
# a[0], a[1], ..., a[i-1] | a[i], a[i+1], ..., a[m-1]
# b[0], b[1], ..., b[j-1] | b[j], b[j+1], ..., b[n-1]
# i+j m-i + n-j
def median(a, b):
# m ,n為兩個陣列的長度
m, n = len(a), len(b)
if m > n:
a, b, m, n = b, a, n, m
# n是較大的那個陣列的長度
if n == 0:
raise valueerror
# [0, m]區間進行查詢
imin, imax = 0, m
# 假設 i+j = m-i + n-j
# 如果n>=m了就說明n陣列比m陣列長 那就在n-j那一部分+1 於是: i+j = m-i + n-j+1
# 於是化簡得到 j = ((m+n+1)/2) - i
half_len =int((m + n + 1) / 2) # 注意要整形,不然沒辦法查詢 注意int(5/2)=2
while imin <= imax:
i = int((imin + imax) / 2)
j = half_len - i
# i>m right就為負了
if i < m and b[j-1] > a[i]:
# 說明a[i]太小了
imin = i + 1
# i<0 更不可能...
elif i > 0 and a[i-1] > b[j]:
# 說明a[i-1]太大了
imax = i - 1
else:
# 這個時候第乙個條件就完成了 進入到第二個條件
# 極限思想去考慮邊界情況
if i == 0:
max_of_left = b[j-1]
elif j == 0:
max_of_left = a[i-1]
# 這個是一般情況 二選一
else:
max_of_left = max(a[i-1], b[j-1])
# 如果是奇數的話 直接返回就行了
if (m + n) % 2 == 1:
return max_of_left
# 偶數的話右邊也要算
if i == m:
min_of_right = b[j]
elif j == n:
min_of_right = a[i]
else:
min_of_right = min(a[i], b[j])
return (max_of_left + min_of_right) / 2.0
if __name__ == '__main__':
a = [1, 2]
b = [3, 4]
ans = median(a, b)
print(ans)
尋找兩個有序陣列的中位數
尋找兩個有序陣列的中位數 user hihone date 2019 1 31 time 16 32 description 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 ...
尋找兩個有序陣列的中位數
思路 將兩個陣列排序,然後判斷陣列長度,長度為單數,則取二分之一處的數,否則取二分之一處和二分之一減一處的數之和除以2.var findmediansortedarrays function nums1,nums2 var mid math.floor arr.length 2 if arr.len...
尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 n...