【題目描述】
給定兩個大小為 m 和 n 的正序(從小到大)陣列nums1
和nums2
。
請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設nums1
和nums2
不會同時為空。
示例1:
nums1 = [1, 3]
nums2 = [2]
中位數為 2.0
示例2:
nums1 = [1, 2]
nums2 = [3 ,4]
中位數為 (2 + 3) / 2 = 2.5
【解題思路】
合併兩個鍊錶;
求出鍊錶中間長度,centersize;
根據合併後鍊錶總長度的奇偶來確定鍊錶的中位數。
分別找到兩個陣列中,中間位置的數(mid_a, mid_b)
比較這兩個數的大小,若mid_a < mid_b,此時第k個數應位於陣列a的右部分或陣列b的左部分
範圍縮小後重新查詢
【解題**】
// 合併鍊錶後再處理
class solution
else
return result;
}};
// 二分法遞迴尋找中位數
// 本題可以看作是尋找陣列中第 k 小數的特例,即 k = (nums1.size() + nums2.size()) / 2
// 1. 分別求出 陣列中 k/2 位置的數 a_nums1, b_nums_2
// 2. 如果 a_nums1 < b_nums_2, 則結果應位於 nums1 的右半部分 或 nums2 的左半部分, 問題的規模縮小
// 3. 求出新的 k, 再進行查詢
class solution
// 陣列2 為空, 直接在陣列1中查詢
if(n == 0)
// 如果兩個陣列都不為空, 且總長度為奇數, 找到陣列中第 k = total/2+1 的元素
if(total % 2 != 0)
return find_kth_val(nums1, 0, nums2, 0, total/2+1);
//如果總長度為偶數, 找到陣列中第 total/2 和 total/2+1 元素的平均
return (find_kth_val(nums1, 0, nums2, 0, total/2) + find_kth_val(nums1, 0, nums2, 0, total/2+1)) / 2.0;
} // 尋找a b 陣列中第k個數
double find_kth_val(vectora, int a_begin, vectorb, int b_begin, int k){
// a b 陣列中第 k/2 個數
// 這裡用 max 初始化 而不是0 初始化 是因為,在後面二分捨去比較大小時,因為a的初始化0導致異常
int mid_a = int_max;
int mid_b = int_max;
// 如果超出陣列範圍, 則在另乙個陣列中的第k個位置
// 注意 元素位序 與 下標的關係
if(a_begin >= a.size())
return b[b_begin + k-1];
if(b_begin >= b.size())
return a[a_begin + k-1];
// 遞迴終止
if(k==1)
return (a[a_begin] < b[b_begin]) ? a[a_begin] : b[b_begin];
// k/2-1是因為 第k小是元素的位序,而下標從0開始
if(a_begin + k/2-1 < a.size())
mid_a = a[a_begin + k/2-1];
if(b_begin + k/2-1 < b.size())
mid_b = b[b_begin + k/2-1];
//cout<<"mid_a: "<【複雜度分析】
方法一的複雜度為o(m+n)
方法二的複雜度:
與二分法的複雜度分析一致,二分的次數就是基本語句的執行次數
若共有n個元素,每次查詢的區間大小為n,n/2,n/4,…,n/2^x,x為二分次數,最差情況(區間不可再分) n/2^x = 1, x=l
og2n
x = log_2n
x=log2
n即複雜度為 o(n)。
【參考文獻】
leetcode題解
尋找兩個正序陣列的中位數
尋找兩個正序陣列的中位數 二分法根據中位數的定義,當 m n 是奇數時,中位數是兩個有序陣列中的第 m n 2 個元素,當 m n 是偶數時,中位數是兩個有序陣列中的第 m n 2 個元素和第 m n 2 1 個元素的平均值。因此,這道題可以轉化成尋找兩個有序陣列中的第 k 小的數,其中 k 為 m...
尋找兩個正序陣列的中位數
題目 給定兩個大小為 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...