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

2022-05-07 10:30:08 字數 1498 閱讀 5858

hard!

題目描述:

有兩個大小為 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

解題思路:

這道題讓我們求兩個有序陣列的中位數,而且限制了時間複雜度為o(log (m+n)),看到這個時間複雜度,自然而然的想到了應該使用二分查詢法來求解。但是這道題被定義為hard也是有其原因的,難就難在要在兩個未合併的有序陣列之間使用二分法,這裡我們需要定義乙個函式來找到第k個元素,由於兩個陣列長度之和的奇偶不確定,因此需要分情況來討論,對於奇數的情況,直接找到最中間的數即可,偶數的話需要求最中間兩個數的平均值。下面重點來看如何實現找到第k個元素,首先我們需要讓陣列1的長度小於或等於陣列2的長度,那麼我們只需判斷如果陣列1的長度大於陣列2的長度的話,交換兩個陣列即可,然後我們要判斷小的陣列是否為空,為空的話,直接在另乙個陣列找第k個即可。還有一種情況是當k = 1時,表示我們要找第乙個元素,只要比較兩個陣列的第乙個元素,返回較小的那個即可。

知識點回顧:

中位數的概念

中位數(又稱中值,英語:median),統計學中的專有名詞,代表乙個樣本、種群或概率分布中的乙個數值,其可將數值集合劃分為相等的上下兩部分。

對於有限的數集,可以通過把所有觀察值高低排序後找出正中間的乙個作為中位數。如果觀察值有偶數個,通常取最中間的兩個數值的平均數作為中位數。

1

class

solution else10}

11double findkth(vector &nums1, int i, vector &nums2, int j, int

k) 23 };

上面的方法變數太多,較為複雜,我們也可以通過在findkth函式中改變陣列元素的個數來去掉一些變數,使**整體看起來更加簡潔清楚,參見**如下:

1

class

solution

7int findkth(vector nums1, vector nums2, int

k) else

18return0;

19}20 };

此題還能用二分搜尋法來解,是一種相當巧妙的應用。講解詳見:

1

class

solution

19return -1;20

}21 };

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 兩個有序陣列,...