尋找兩個正序陣列的中位數
二分法根據中位數的定義,當 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 ...