馬上就要開始吧找工作啦,本科沒有刷leecode,現在開始刷題啦!每天一道題,堅持下去,加油吧!
給定兩個大小為 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))o(log(m+n))o(log(m+n)),我們可以用 o(m+n)o(m+n)o(m+n) 的演算法解決,用兩個指標分別指向兩個陣列,比較指標下的元素大小,一共移動次數為 (m+n + 1)/2,便是中位數。
首先,我們理解什麼中位數:指的是該數左右個數相等。
比如:odd : [1,| 2 |,3],2 就是這個陣列的中位數,左右兩邊都只要 1 位;
even: [1,| 2, 3 |,4],2,3 就是這個陣列的中位數,左右兩邊 1 位;
那麼,現在我們有兩個陣列:
num1: [a1,a2,a3,...an]
nums2: [b1,b2,b3,...bn]
[nums1[:left1],nums2[:left2] | nums1[left1:], nums2[left2:]]
只要保證左右兩邊 個數 相同,中位數就在 | 這個邊界旁邊產生。
如何找邊界值,我們可以用二分法,我們先確定 num1 取 m1 個數的左半邊,那麼 num2 取 m2 = (m+n+1)/2 - m1 的左半邊,找到合適的 m1,就用二分法找。
當 [ [a1],[b1,b2,b3] | [a2,..an],[b4,...bn] ]
我們只需要比較 b3 和 a2 的關係的大小,就可以知道這種分法是不是準確的!
例如:我們令:
nums1 = [-1,1,3,5,7,9]
nums2 =[2,4,6,8,10,12,14,16]
當 m1 = 4,m2 = 3 ,它的中位數就是median = (num1[m1] + num2[m2])/2
時間複雜度:o(log(min(m,n)))o(log(min(m,n)))o(log(min(m,n)))
對於**中邊界情況,大家需要自己琢磨。
三、**:
class solution:
def findmediansortedarrays(self, nums1: list[int], nums2: list[int]) -> float:
n1 =len(nums1)
n2 = len(nums2)
if(n1 > n2):
return self.findmediansortedarrays(nums2, nums1)
k = (n1 + n2 + 1)//2
left = 0
right = n1
while(left < right):
m1 = left + (right - left)//2
m2 = k - m1
if(nums1[m1] < nums2[m2-1]):
left = m1 + 1
else:
right = m1
m1 = left
m2 = k - m1
c1 = max(nums1[m1-1] if(m1 > 0) else float("-inf"), nums2[m2-1] if(m2 > 0) else float("-inf"))
if((n1 + n2)%2 == 1):
return(c1)
c2 = min(nums1[m1] if(m1 < n1) else float("inf"), nums2[m2] if(m2 < n2) else float("inf"))
return (c1 + c2)/2
leecode4 尋找兩個正序陣列的中位數
1.題目描述 給定兩個大小分別為m和n的正序 從小到大 陣列nums1和nums2。請你找出並返回這兩個正序陣列的 中位數 2.示例 示例 1 輸入 nums1 1,3 nums2 2 輸出 2.00000 解釋 合併陣列 1,2,3 中位數 2示例 2 輸入 nums1 0,0 nums2 0,0...
4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
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...