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

2021-10-25 15:06:03 字數 3132 閱讀 8153

一. 無腦傻瓜版本:

沒看答案

1.把兩個陣列合併成乙個陣列並排序;

2.找到新陣列的中位數。

class

solution

:def

findmediansortedarrays

(self, nums1, nums2)

: ls =

list()

for i in nums1:

for j in nums2:

ls.sort(

) num =

len(ls)

a =0if num %2==

0:a =

(ls[num//2-

1]+ ls[num//2]

)/2else

: a = ls[num//2]

return a

複雜度分析:

二. 二分查詢:

主要思路:

class

solution

:def

findmediansortedarrays

(self, nums1, nums2)

: m, n =

len(nums1)

,len

(nums2)

defgetkthitem

(k):

index0, index1 =0,

0# nums1 和 nums2 的指標位置

while

true

:if index0 == m:

return nums2[index1 + k -1]

if index1 == n:

return nums1[index0 + k -1]

if k ==1:

return

min(nums1[index0]

, nums2[index1]

)

newindex0 =

min(index0 + k//2-

1, m-1)

# 二分查詢,且防止越界

newindex1 =

min(index1 + k//2-

1, n-1)

# 二分查詢,且防止越界

prior1, prior2 = nums1[newindex0]

, nums2[newindex1]

if prior1 <= prior2:

# 一次只對乙個陣列進行操作

k -= newindex0 - index0 +

1# k減去刪除元素的個數

index0 = newindex0 +

1# 「刪除」元素

else

: k -= newindex1 - index1 +

1# k減去刪除元素的個數

index1 = newindex1 +

1# 「刪除」元素

totallength = m + n

if totallength %2==

0:return

(getkthitem(totallength//2)

+ getkthitem(totallength//2+

1))/

2else

:return getkthitem(totallength//2+

1)

複雜度分析:

python

class

solution

:def

findmediansortedarrays

(self, nums1: list[

int]

, nums2: list[

int]):

m, n =

len(nums1)

,len

(nums2)

deffindkthnum

(nums1, nums2, k)

: index1, index2 =0,

0while

true

:if index1 == m:

return nums2[index2 + k -1]

elif index2 == n:

return nums1[index1 + k -1]

elif k ==1:

return

min(nums1[index1]

, nums2[index2]

) mid = k//2-

1 newindex1 =

min(index1+mid, m-1)

newindex2 =

min(index2+mid, n-1)

a, b = nums1[newindex1]

, nums2[newindex2]

if a <= b:

k -= newindex1 - index1 +

1 index1 = newindex1 +

1else

: k -= newindex2 - index2 +

1 index2 = newindex2 +1if

(m+n)%2

==1: k =

(m+n+1)

//2return findkthnum(nums1, nums2, k)

else

: k1 =

(m+n)//2

k2 =

(m+n)//2

+1return

(findkthnum(nums1, nums2, k1)

+ findkthnum(nums1, nums2, k2))/

2

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

力扣 尋找兩個正序陣列的中位數 hard 如下圖所示,中位數必然滿足這樣的分割線,將兩個陣列分別分為兩個部分,最終組成四個部分,分別為t1 left,t1 right,t2 left,t2 right,其中t1代表第乙個陣列,t2代表第二個陣列,left 代表分割線左邊的部分,right 代表分割線...

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

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