python 查詢兩個有序陣列的中位數

2021-09-19 05:58:19 字數 1599 閱讀 6087

現有兩個大小為 m 和 n 的有序陣列nums1nums2

請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。

你可以假設nums1nums2不會同時為空。

示例 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 ...