現有兩個大小為 m 和 n 的有序陣列nums1
和nums2
。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設nums1
和nums2
不會同時為空。
示例 1:
nums1 = [1, 3]中位數的作用:將乙個集合劃分為兩個長度相等的子集,其中乙個子集中的元素總是大於另乙個子集中的元素。nums2 = [2]
則中位數是 2.0
解題方法:遞迴法
def median(a, b):
m, n = len(a), len(b)
if m > n:
a, b, m, n = b, a, n, m
if n == 0:
raise valueerror
imin, imax, half_len = 0, m, (m + n + 1) / 2
while imin <= imax:
i = (imin + imax) / 2
j = half_len - i
if i < m and b[j-1] > a[i]:
# i is too small, must increase it
imin = i + 1
elif i > 0 and a[i-1] > b[j]:
# i is too big, must decrease it
imax = i - 1
else:
# i is perfect
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
時間復制度的分析
1、時間複雜度:o\big(\log\big(\text(m,n)\big)\big)o(log(min(m,n))),
首先,查詢的區間是 [0, m][0,m]。 而該區間的長度在每次迴圈之後都會減少為原來的一半。 所以,我們只需要執行 \log(m)log(m) 次迴圈。由於我們在每次迴圈中進行常量次數的操作,所以時間複雜度為 o\big(\log(m)\big)o(log(m))。 由於 m \leq nm≤n,所以時間複雜度是 o\big(\log\big(\text(m,n)\big)\big)o(log(min(m,n)))。
2、空間複雜度:o(1)o(1), 我們只需要恆定的記憶體來儲存 99 個區域性變數, 所以空間複雜度為 o(1)o(1)。
合併兩個有序陣列python
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 示例 輸入 nums1 1,2,3,0,0,0 m 3 nums2 2,5,6 n 3 輸出 1,2,2,3,5,6 coding utf 8 author xinxin...
python 合併兩個有序陣列
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 示例 輸入 nums1 1,2,3,0,0,0 m 3 nums2 2,5,6 n 3輸出 1,2,2,3,5,6 思路1.簡單粗暴,先合併再排序。嗯。這樣寫有點耍牛氓。...
查詢兩個有序陣列的中位數
題目 給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 class solution for ...