給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。1.題目要求時間複雜度要求為o(l請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 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
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,...