力扣 尋找兩個正序陣列的中位數 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 思路 因為兩...