給定兩個大小為 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無效,則返回defaultvalfunc 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...