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

2021-10-06 10:36:35 字數 2802 閱讀 3531

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

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

示例 1:

nums1 =[1

,3]nums2 =[2

]則中位數是 2.0

示例 2:

nums1 =[1

,2]nums2 =[3

,4]則中位數是 (2+

3)/2

=2.5

方法一:合併陣列

將兩個陣列合併為乙個,遍歷計算中位數 ,時間複雜讀o(m+n);

方法二:

不用合併陣列,雙指標思想,

i=j=

0a[i]

>b[j]

?j++

:i++

;

比較次數的問題,分為兩種,一種是兩陣列元素個數和sizesum為奇數,中位數為處於sizesum/2+1位置上,遍歷sizesum/2+1次;和為偶數,中位數字於sizesum/2sizesum/2+1之間,所以還是遍歷sizesum/2+1次。這就統一起來了。

還有乙個問題是陣列結束的問題,如果乙個陣列沒有元素了,只能另外乙個陣列後移。所以迴圈條件應該是

保證a陣列後面還有數字,如果b後面沒有數字或者a[i]size()

&&(j>=b.

size()

&&a[i]

)偶數的時候,需要乙個變數記錄上乙個遍歷的值,然後和當前值做平均求得中位數。

**:

class

solution

//如果是奇數陣列

if(len&1)

return right;

//如果是偶數陣列

else

return

(double

)(right+left)

/2.0;}

};

python3:

def

findmediansortedarrays

(self,nums1:list[

int]

,nums2:list[

int])-

>

float

:class

solution

:def

findmediansortedarrays

(self, nums1: list[

int]

, nums2: list[

int])-

>

float

: m,n=

len(nums1)

,len

(nums2)

left,right,astart,bstart=-1

,-1,

0,0 lenth=m+n

for i in

range

(int

(lenth/2+

1)):

left = right

if astart(bstart>=n or nums2[bstart]

>nums1[astart]):

right = nums1[astart]

astart+=

1else

: right = nums2[bstart]

bstart+=

1if lenth%2==

1:return right

else

:return

float

((right+left)

/2.0

)

方法三:

一一遍歷的時間複雜度還是o(m+n),要達到log級別,首先想到二分查詢,不一一遍歷,而是一半一半的遍歷。其實題目就是求第k小的數的一種形式。

方法四:割片。

詳細解釋參考原文

**:

class

solution

// ci 為第i個陣列的割,比如c1為2時表示第1個陣列只有2個元素。lmaxi為第i個陣列割後的左元素。rmini為第i個陣列割後的右元素。

int lmax1, lmax2, rmin1, rmin2, c1, c2, lo =

0, hi =

2* n;

//我們目前是虛擬加了'#'所以陣列1是2*n長度

while

(lo <= hi)

//二分

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

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