7 20 尋找兩個正序陣列的中位數 困難

2021-10-08 08:23:12 字數 2427 閱讀 3453

【題目描述】

給定兩個大小為 m 和 n 的正序(從小到大)陣列nums1nums2

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

你可以假設nums1nums2不會同時為空。

示例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...