給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 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
題意:求兩個有序陣列的中位數。看到o(log(m+n)),就分治法(二分法?)。
思路:中位數的概念,一組數中,有幾個比中位數大的就有幾個比中位數小的。如果這組數是奇數n,中位數index是n/2.。如果是偶數,中位數是index為n/2 和(n-1)/2的平均數。設中位數index為k,求兩有序陣列中第k小即可。
class
solution
:def
findmediansortedarrays
(self, nums1: list[
int]
, nums2: list[
int])-
>
float
:def
findkthelement
(arr1, arr2, k)
: len1, len2 =
len(arr1)
,len
(arr2)
//讓arr1存長度較小的陣列
if len1 > len2:
return findkthelement(arr2, arr1, k)
//如果arr1不存在,直接在arr2找中位數
ifnot arr1:
return arr2[k-1]
//如果k==
1,意思是找第一小的,就找兩陣列中最小的乙個。
if k ==1:
return
min(arr1[0]
, arr2[0]
)//i,j分別儲存當前找的index。找第k小,分兩個陣列,每個陣列從k/
2開始找起。
i, j =
min(k //
2, len1)-1
,min
(k//
2, len2)-1
// 如果arr1[i]大於arr2[j]
,說明i位置不是中位數,因為arr2中有大於中位數的話,大於中位數的量要大於小於中位數的量,不符合中位數的定義。所以繼續找。現知資訊arr2[
0:j-
1]全部小於arr1[i]
,中位數可以從arr2[j+1:
]和arr1中找,其中,中位數的index從,第k小,變成了k-j-
1小。 if arr1[i]
> arr2[j]
:return findkthelement(arr1, arr2[j+1:
], k-j-1)
//反之也是。
else
:return findkthelement(arr1[i+1:
], arr2, k-i-1)
// l1, l2 =
len(nums1)
,len
(nums2)
// 對於奇偶問題,直接取兩個中位數(可能相等)的平均數,left對應index即為第k小。
left, right =
(l1+l2+1)
//2,(l1+l2+2)
//2return
(findkthelement(nums1, nums2, left)
+ findkthelement(nums1, nums2, right))/
2
不好理解看 部落格 c語言: 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,...