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

2021-10-18 04:18:07 字數 1716 閱讀 2005

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

如下圖所示,中位數必然滿足這樣的分割線, 將兩個陣列分別分為兩個部分,最終組成四個部分,分別為t1_left, t1_right, t2_left, t2_right, 其中t1代表第乙個陣列, t2代表第二個陣列, left 代表分割線左邊的部分, right 代表分割線右邊的部分。

m+n是奇數時,只需要找到中間位置的元素,max(t1_left, t2_left)m+n是偶數時,需要找到中間倆元素,取平均值(max(t1_left, t2_left) + min(t1_right+t2_right))/2

值得注意的是,由於是分割線,m個元素的陣列有m+1個分割位置,即將所有元素分為right部分 或者 所有元素分為left部分,此時需要邊界值處理。

即**中的如下

double t1_left =

(i==0?

-dbl_max : t1[i-1]

), t1_right =

(i==m ? dbl_max : t1[i]

), t2_left =

(j ==0?

-dbl_max : t2[j-1]

), t2_right =

(j == n ? dbl_max : t2[j]

);

class solution 

int m = t1.

size()

, n = t2.

size()

;int left =

0, right = m, mid =

(m+n+1)

/2;// 找到一條分割線 使得 t1[i-1] <= t2[j] && t2[j-1] <= t1[i] 且 i+j = (m+n+1)/2 分割線的左側為

int i =

0, j =0;

// 二分查詢

while

(left < right)

else

} i = left;

j = mid - left;

// cout << i << " " << j;

double t1_left =

(i==0?

-dbl_max : t1[i-1]

), t1_right =

(i==m ? dbl_max : t1[i]

), t2_left =

(j ==0?

-dbl_max : t2[j-1]

), t2_right =

(j == n ? dbl_max : t2[j]);

// cout << t1_left << " " << t1_right << " " << t2_left << " " << t2_right;if(

(m+n)%2

==1)else

return

0.0;}}

;

尋找兩個正序陣列的中位數 二分查詢4

一.無腦傻瓜版本 沒看答案 1.把兩個陣列合併成乙個陣列並排序 2.找到新陣列的中位數。class solution def findmediansortedarrays self,nums1,nums2 ls list for i in nums1 for j in nums2 ls.sort n...

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

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