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

2021-10-02 04:23:34 字數 3538 閱讀 5368

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。

請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(l

og(m

+n))

o(log(m + n))

o(log(

m+n)

)。你可以假設 nums1 和 nums2 不會同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

則中位數是 (2 + 3)/2 = 2.5

1.題目要求時間複雜度要求為o(l

og2n

)o(log_2n)

o(log2

​n),因此像歸併後取中位數這樣o(n

)o(n)

o(n)

的方法不符合題目要求。題目要求o(l

og2n

)o(log_2n)

o(log2

​n),解法肯定用到二分的思想。

2. 中提供了乙個非常好的思路,將取中位數轉化為取topk問題,即從兩陣列中取第k小的數,以下圖為例,假設取第7小的數,比較兩陣列中k/2=3位置元素大小,此圖中4

>

34>3

4>

3,所以在第二個陣列中3的元素肯定不為所求第k小的數,因此去除元素1,2,3。更新k=k

−3k=k-3

k=k−

3,繼續執行上述操作至k=1。小細節是若k大於陣列長度,則取陣列最後乙個元素做比較。

第一次提交寫了個屎一樣的**

class

solution

:def

findmediansortedarrays

(self, nums1: list[

int]

, nums2: list[

int])-

>

float

: l1=

len(nums1)

l2=len(nums2)

mid=k=

(l1+l2)//2

if(l1+l2)%2

!=0: k+=

1while k!=

1and nums1 and nums2:

a=min(

len(nums1)

,k//2)

-1b=

min(

len(nums2)

,k//2)

-1if nums1[a]

>nums2[b]

: temp=

len(nums2[

:b+1])

nums2=nums2[b+1:

]else

: temp=

len(nums1[

:a+1])

nums1=nums1[a+1:

] k=k-temp

if(l1+l2)%2

!=0:if

len(nums2)==0

:return nums1[k-1]

iflen

(nums1)==0

:return nums2[k-1]

return nums1[0]

if nums1[0]

else nums2[0]

else:if

len(nums2)==0

:return

(nums1[k-1]

+nums1[k])/

2iflen(nums1)==0

:return

(nums2[k-1]

+nums2[k])/

2if nums1[0]

: res=nums1[0]

iflen

(nums1)

>1:

res+=nums1[1]

if nums1[1]

else nums2[0]

else

: res+=nums2[0]

else

: res=nums2[0]

iflen

(nums2)

>1:

res+=nums2[1]

if nums2[1]

else nums1[0]

else

: res+=nums1[0]

return res/

2

參考他人的寫法後,決定採用遞迴的方法簡化邏輯。

class

solution

:def

findmediansortedarrays

(self, nums1: list[

int]

, nums2: list[

int])-

>

float

: l1=

len(nums1)

l2=len(nums2)

k1=(l1+l2+1)

//2k2=

(l1+l2+2)

//2return

(self.find_topk(nums1,nums2,k1)

+self.find_topk(nums1,nums2,k2))/

2def

find_topk

(self,nums1,nums2,k):if

len(nums2)==0

:return nums1[k-1]

iflen

(nums1)==0

:return nums2[k-1]

if k==1:

return

min(nums1[0]

,nums2[0]

) a=

min(

len(nums1)

,k//2)

-1b=

min(

len(nums2)

,k//2)

-1if nums1[a]

>nums2[b]

: tmp=

len(nums2[

:b+1])

nums2=nums2[b+1:

]else

: tmp=

len(nums1[

:a+1])

nums1=nums1[a+1:

] k=k-tmp

return self.find_topk(nums1,nums2,k)

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,...