尋找兩個正序陣列的中位數

2021-10-06 11:39:18 字數 1195 閱讀 8435

尋找兩個正序陣列的中位數

二分法根據中位數的定義,當 m+n 是奇數時,中位數是兩個有序陣列中的第 (m+n)/2 個元素,當 m+n 是偶數時,中位數是兩個有序陣列中的第 (m+n)/2 個元素和第 (m+n)/2+1 個元素的平均值。因此,這道題可以轉化成尋找兩個有序陣列中的第 k 小的數,其中 k 為 (m+n)/2 或 (m+n)/2+1。

假設有兩個正序陣列a、b,要找第 k 個元素,我們可以比較 a[k/2−1] 和 b[k/2−1]。由於 a[k/2−1] 和 b[k/2−1] 的前面分別有 a[0 … k/2−2] 和 b[0 … k/2−2],即 k/2−1 個元素,對於 a[k/2−1] 和 b[k/2−1] 中的較小值,最多隻會有 (k/2−1)+(k/2−1)≤k−2 個元素比它小,那麼它就不能是第 k 小的數了,這k/2個數可以排除掉,k 也應該減去排除的個數。

有以下三種情況需要特殊處理:

/**

* question: 二分法查詢兩個有序陣列的中位數

* @param nums1

* @param nums2

* @return

*/public

static

double

findmediansortedarrays

(int

nums1,

int[

] nums2)

else

}public

static

intgetkthelement

(int

nums1,

int[

] nums2,

int k)

if(index2 == len2)

if(k ==1)

// 正常情況

int half = k /2;

int newindex1 = math.

min(index1 + half, len1)-1

;int newindex2 = math.

min(index2 + half, len2)-1

;int pivot1 = nums1[newindex1]

, pivot2 = nums2[newindex2];if

(pivot1 <= pivot2)

else

}}

時間複雜度 o(log(m+n)),空間複雜度 o(1)

尋找兩個正序陣列的中位數

題目 給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 思路 因為兩...

尋找兩個正序陣列的中位數

給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數 示例 1 輸入 nums1 1,3 nums2 2 輸出 2.00000 解釋 合併陣列 1,2,3 中位數 2 示例 2 輸入 nums1 1,2 nums2 3,4 輸出 2.5...

尋找兩個正序陣列的中位數

突然發現還有文章標題,前兩天忘記寫了,今天是自己搞出來的 廢話不多說,開整 示例 1 輸入 nums1 1,3 nums2 2 輸出 2.00000 解釋 合併陣列 1,2,3 中位數 2 示例 2 輸入 nums1 1,2 nums2 3,4 輸出 2.50000 解釋 合併陣列 1,2,3,4 ...