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

2021-10-06 16:59:19 字數 3271 閱讀 6559

給定兩個大小為 m 和 n 的正序(從小到大)陣列nums1nums2

請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。

你可以假設nums1nums2不會同時為空。

示例 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:]]

只要保證左右兩邊個數相同,中位數就在|這個邊界旁邊產生。

如何找邊界值,我們可以用二分法,我們先確定num1m1個數的左半邊,那麼num2m2 = (m+n+1)/2 - m1的左半邊,找到合適的m1,就用二分法找。

[ [a1],[b1,b2,b3] | [a2,..an],[b4,...bn] ]

我們只需要比較b3a2的關係的大小,就可以知道這種分法是不是準確的!

例如:我們令:

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:

deffindmediansortedarrays

(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 else float("inf"))

return (c1 + c2) / 2

class

solution

const

int m1 = left;

const

int m2 = k - left;

const

int c1 = max(m1 <= 0 ? int_min:nums1[m1-1],

m2 <= 0 ? int_min:nums2[m2-1]);

if((n1 + n2)%2 == 1)

return c1;

const

int c2 = min(m1 >= n1 ? int_max: nums1[m1],

m2 >= n2 ? int_max : nums2[m2]);

return (c1 + c2) * 0.5;

}};

class

solution

int m1 = left;

int m2 = k - left;

int c1 = math.max(m1 <= 0 ? integer.min_value : nums1[m1-1],

m2 <= 0 ? integer.min_value : nums2[m2-1]);

if ((n1 + n2) % 2 == 1)

return c1;

int c2 = math.min( m1 >= n1 ? integer.max_value :nums1[m1],

m2 >= n2 ? integer.max_value : nums2[m2]);

return (c1 + c2) * 0.5;}

}

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

思路 我現在還沒有進行優化,大概就是合併陣列 參照之前的順序表合併 然後如果合併陣列的大小sum是偶數,返回sum 2和sum 2 1兩個元素除以二,如果sum是奇數則直接返回sum 2的元素 double findmediansortedarrays int nums1,int nums1size...

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

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

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

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