LeetCode 4 兩個排序陣列的中位數

2021-09-13 18:50:22 字數 2411 閱讀 1480

兩個排序陣列的中位數median of two sorted arrays

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

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

示例 1:

nums1 = [1, 3]

nums2 = [2]

中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

中位數是 (2 + 3)/2 = 2.5

: 陣列,二分查詢,分治演算法

題目給定兩個有序的陣列,找出中位數並不困難,最簡單的乙個迴圈就行,時間複雜度 $o(m+n)$ 。但是題目要求時間複雜度為 $o(\log (m+n))$ 就是乙個大問題,具體思路採用二分查詢,如下:

其中k 表示要求的中位數的位置,初始化 $k = (m + n + 1) / 2$ 和 $k = (m + n + 2) / 2$,即 $m + n$ 是偶數時為中間兩個, $m + n$ 是奇數時為中位數的後面乙個。

首先將 a 劃分為左右兩部分,其中 $i = k / 2$ ,$length(left_a) = i,length(right_a) = k - i$

left_a             |        right_a

a[0], a[1], ..., a[i-1] | a[i], a[i+1], ..., a[m-1]

然後將 b 劃分為左右兩部分,其中 $j = k / 2$ ,$length(left_a) = j,length(right_a) = k - j$

left_b             |        right_b

b[0], b[1], ..., b[j-1] | b[j], b[j+1], ..., b[n-1]

則,a、b 陣列可分為左右兩部分,如下:

left          |          right

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]

劃重點來了

如果,$a[i-1] > b[j-1]$,則說明,中位數一定在 $left_a、right_a、right_b$中,這樣就排除了$left_b$,想想這是為什麼?

因為有$a[i-1] > b[j-1]$ 不妨設 $a[0] > b[p],p=0,1,2,\ldots,j-1$ 則中位數一定不在$left_b$中,所以縮小查詢範圍。

left          |          right

a[0], a[1], ..., a[i-1] | a[i], a[i+1], ..., a[m-1]

| b[j], b[j+1], ..., b[n-1]

如果,$a[i-1] < b[j-1]$,則說明,中位數一定在 $right_a、left_b、right_b$中,這樣就排除了$left_a$,想想這是為什麼?理由同上。

left          |          right

| a[i], a[i+1], ..., a[m-1]

b[0], b[1], ..., b[j-1] | b[j], b[j+1], ..., b[n-1]

接下來,將縮小範圍的新陣列 a 或者 b 按同樣的劃分,同樣的縮小範圍,就可得到最後結果。

由上可得,方法為二分查詢,定義遞迴函式,確定遞迴函式的出口為:

如何確定奇數個數取中位數,偶數個數取中間兩個數的平均數,我想,利用整數除法的規則,很容易就得到 中位數為(m + n + 1) >> 1這個數與(m + n + 2) >> 1取平均值即可,當個數為奇數時,兩個數就是中間乙個數。

class solution 

int getkth(int* ln, int m, int* rn, int n, int k)

if (m == 0)

if (k == 1)

int i = min(m, k / 2), j = min(n, k / 2);

if (ln[i - 1] > rn [j - 1]) else

}};

leetcode 4 兩個排序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n 示例 1 nums1 1,3 nums2 2 中位數是 2.0 示例 2 nums1 1,2 nums2 3,4 中位數是 2 3 2 2.5 思路 兩個陣...

LeetCode 4 兩個排序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n nums1 1,3 nums2 2 中位數是 2.0 nums1 1,2 nums2 3,4 中位數是 2 3 2 2.5 本來可以歸併排序,直接求中位數,但是由...

LeetCode4 兩個排序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n 示例 1 nums1 1,3 nums2 2 中位數是 2.0示例 2 nums1 1,2 nums2 3,4 中位數是 2 3 2 2.5 兩個有序陣列,...