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

2022-04-05 05:52:22 字數 2269 閱讀 4657

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

題解:

如果不考慮時間複雜度的話,最簡單的做法,就是將nums1和nums2合併成乙個陣列並進行排序,然後取該陣列的中位數,但是哪怕是快速排序,時間也為o(nlogn),明顯與題目要求的o(log(m+n))不相符。所以,我們要另闢蹊徑。而題目除了給出的兩個陣列,同時還告訴我們,這兩個陣列,是有序陣列,這使得我們可以利用有序,在o(log(m+n))的時間複雜度內,尋得中位數。

我們要知道,中位數的作用,是將陣列的兩端分成兩個等長的片段,如:1 2 |3| 4 5或1 2 |3 4| 5 6,符號|將原陣列除中位數外,分割成兩個等長的片段。那麼,現在我們有兩個陣列:num1: [a1,a2,a3,...an]和nums2: [b1,b2,b3,...bm],我們用|來分割陣列[nums1[:i],nums2[:j] | nums1[i:], nums2[j:]],只要能保證經由|分割出來的兩個片段是等長的,中位數就在|這個邊界產生。

首先,我們來做乙個假設,我們假設nums1的長度永遠小於或者等於nums2,那麼,nums2至少包含乙個中位數。其次,我們假定nums3是nums1和nums2合併後並按照順序排列,如果len(nums3)的長度為奇數,那麼中位數的位置則為(len(nums3)+1)/2,如果len(nums3)為偶數,那麼中位數的位置有兩個,len(nums3)/2和(len(nums3)/2)+1,而在計算機的世界裡,任何整數除以2,都會向下取整,比如整數6和7除以2的結果都是3,為了方便表示,我們統一認為中位數會在(len(nums3)+1)/2的位置上出現,即(len(nums1)+len(nums2)+1)/2。

比如:nums3 = [1,2,3,4,5,6,7],那麼中位數處於m=(7+1)/2=4

或者nums3=[1,2,3,4,5,6],那麼中位數處於m1=(6+1)/2=3,m2=m1+1=4

我們看下面的**,我們假定nums1的索引i和nums2的索引j處於|的兩端,len(left)=len(right)且max(ai,bj)<=min(ai+1,bj+1)。

left

right

[a1,a2……ai],[b1,b2,……bj]

[ai+1,……an],[bj+1,……bm]

如果我們能確定i在nums1中的位置,那麼同樣可以確定j在nums2的位置,j=(len(nums1)+len(nums2)+1/2)-i。

現在,我們就可以開始著手寫程式了:

//根據index獲取nums中的值,如果index無效,則返回defaultval

func getvalwithdefault(nums int, index int, defaultval int) int

return defaultval

}func findmediansortedarrays(nums1 int, nums2 int) float64

l1, l2 := len(nums1), len(nums2)

left, right := 0, l1

m := (l1 + l2 + 1) / 2

for left < right else

} right = m - left //<3>定位到j的位置

maxleft := math.max(

float64(getvalwithdefault(nums1, left-1, math.minint32)),

float64(getvalwithdefault(nums2, right-1, math.minint32)),

) if (l1+l2)%2 == 1

minright := math.min(

float64(getvalwithdefault(nums1, left, math.maxint32)),

float64(getvalwithdefault(nums2, right, math.maxint32)),

) return (maxleft + minright) / 2

}

按照上述**,我們可以將時間複雜度控制在log(min(m,n))之內。

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

尋找兩個有序陣列的中位數 user hihone date 2019 1 31 time 16 32 description 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 ...

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

思路 將兩個陣列排序,然後判斷陣列長度,長度為單數,則取二分之一處的數,否則取二分之一處和二分之一減一處的數之和除以2.var findmediansortedarrays function nums1,nums2 var mid math.floor arr.length 2 if arr.len...

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

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 n...