leetcode 4尋找兩個有序陣列的中位數

2021-10-03 08:36:04 字數 1866 閱讀 1747

給定兩個大小為 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,...