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

2021-10-02 15:44:26 字數 1933 閱讀 6288

給定兩個大小為 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,...