給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設 nums1 和 nums2 不會同時為空。
nums1 = [1, 3]
nums2 = [2]
則中位數是 2.0
nums1 = [1, 2]
nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
首先要求log級別的時間複雜度,那麼肯定需要歸併、二分這一類的操作。
我們假定第乙個陣列的長度小於第二個陣列的長度,那麼根據中位數的性質:將一組資料分為兩組等長的資料,那麼我們可以使得i為a陣列分割點,j為b陣列分割點,其中
a [0
,i−1
].le
n+b[
0,j−
1].l
en=a
[i,a
.len
].le
n+b[
j,b.
len]
.len
=(a.
len+
b.le
n)/2
a[0,i-1].len+b[0,j-1].len = a[i,a.len].len+b[j,b.len].len\\=(a.len+b.len)/2
a[0,i−
1].l
en+b
[0,j
−1].
len=
a[i,
a.le
n].l
en+b
[j,b
.len
].le
n=(a
.len
+b.l
en)/
2那麼我們就可以通過這個條件來尋找i指標的位置,那麼我們該如何調整i的位置呢?
根據上圖,我們需要
b [j
−1]<=a
[i]&
&a[i
−1]<=b
[j]b[j-1]<=a[i] \& \& a[i-1]<=b[j]
b[j−1]
<=a
[i]&
&a[i
−1]<=b
[j]所以根據上式調整就好了,詳情見**分析
public
double
findmediansortedarrays
(int
nums1,
int[
] nums2)
// 處理乙個陣列為空的情況
if(m ==0)
else
return ans;
}int imin =
0,imax = m-
1,midlen =
(m+n+1)
/2;// /4+5,5+5/
while
(imin<=imax)
else
if(i>imin && nums1[i-1]
>nums2[j]
)else
else
if(j==0)
else
int rightmin =0;
if(i==m)
else
if(j==n)
elseif(
(m+n)%2
==1)else}}
return
0.0;
}
LeetCode 4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
LeetCode 4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nums2 3,...
LeetCode4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nums2 3,...