給定兩個有序陣列arr1和arr2,已知兩個陣列的長度都為n,求兩個陣列中所有數的上中位數。上中位數:假設遞增序列長度為n,若n為奇數,則上中位數為第n/2+1個數;否則為第n個數
輸入為:arr1 = [1, 2, 3, 4], arr2 = [3, 4, 5, 6]
,輸出為3
輸入為:arr1 = [0, 1, 2], arr2 = [3, 4, 5]
,輸出為2
假設現在的輸入為arr1 = [1, 2, 3, 4], arr2 = [3, 4, 5, 6], n = 4, arr = [1, 2, 3, 3, 4, 4, 5, 6]
選出兩個陣列的上中位數的下標m1 = (n - 1) / 2 = 1, m2 = (n - 1) / 2 = 1
arr1[m1] = 2, arr2[m2] = 4 => arr2[m2] > arr1[m1]
通過對比中位數可以發現中位數一定在arr1[m1+1,...,n-1]
和arr2[0,...,m2]
這樣兩個範圍之內
腦子不是很好,看書和部落格的時候沒能理解為什麼這個結論為什麼正確,所以下面說下我自己的看法,不一定對
arr1[0,...,m1]
均小於arr2[m2]
,而arr2[0,...,m2-1]
也均小於(等於)arr2[m2]
,這樣包括arr2[m2]
在內的長度也就有n了,所以可能在arr2[m2]取到上中位數而arr2[m2+1,...,n-1]
裡肯定沒有中位數,可得r2 = m2
,同樣arr2[0,...,m2-1]
裡的數只要比arr2[m2]
小之外就沒有其它規定了,做個極端的假設,max < min
(這樣是arr1[0,...,m1]
中能取到上中位數的唯一可能),即便是這種情況[0, m2-1]有乙個數,[0, m1]有兩個數,合起來也只有三個數,而上中位數是從小到大的第四個數,所以可以排除掉上中位數在arr1[0,...,m1]
的可能
所以l1 = m1 + 1; r2 = m2;
如果arr2[m2] < arr1[m1]
,可以簡單的認為把上面的arr1和arr2做了交換之後套用上面的方法
當輸入為arr1 = [0, 1, 2], arr2 = [3, 4, 5]
長度為奇數時與長度為偶數時略有不同
arr1[m1] < arr2[m2]
:l1 = m1; r2 = m2;
舉例說明下區別:此時arr1[m1] = 1, arr2[m2] = 4
,m1-0+1 + m2-0+1 = ((n-1)/2+1) * 2 = n + 1
,這兩部分的數就已經超過了中位數的位置,可以排除掉arr2[m2+1,...,n-1]
這一部分,所以和上面一樣r2 = m2
。不同的點在於l1
的變化由l1 = m1 + 1
變為了l1 = m1
,這一點的原因也可以通過假設一下極端情況,arr1[0,...,m1-1]
和arr2[0,...,m2-1]
的值均小於math.min(arr1[m1], arr2[m2])
,那麼上中位數就會在arr1[m1]
取到,所以l1 = m1
arr1[m1] > arr2[m2]
:l2 = m2; r1 = m1;
時間複雜度o(l
ogn)
o(log n)
o(logn
),空間複雜度o(1
)o(1)
o(1)
public
static
intfindmidintwosortarray
(int
arr1,
int[
] arr2)
int n = arr1.length, l1 =
0, r1 = n -
1, l2 =
0, r2 = n -1;
int m1 =
(n-1)/
2, m2 = m1;
int length;
// 二分查詢結束
while
(l1 < r1)
else
if(arr1[m1]
< arr2[m2]
)else
}// 返回二者的最小值
return math.
min(arr1[l1]
, arr2[l2]);
}
【遞迴打卡1】在兩個長度相等的排序陣列種找到上中位數 在兩個長度相等的排序陣列中找到上中位數
在兩個長度相等的排序陣列中找到上中位數 給定兩個有序陣列arr1和arr2,已知兩個陣列的長度都為n,求兩個陣列中所有數的上中位數。上中位數 假設遞增序列長度為n,若n為奇數,則上中位數為第n 2 1個數 否則為第n個數 要求 時間複雜度為o l ogn o logn o logn 額外空間複雜度為...
演算法總結之 在兩個長度相等的排序陣列中找到上中位數
題目描述 arr1 和 arr2 長度都為n 求兩個陣列中所有數的上中位數 要求 時間複雜度 o logn 額外空間複雜度o 1 這道題目的方法比較好玩 這兩個陣列如下表示 arr1 start1.end1 arr2 start2.end2 如果start1 start2 那麼也有start2 en...
牛客題霸 在兩個長度相等的排序陣列中找到上中位數
題目描述 給定兩個有序陣列arr1和arr2,已知兩個陣列的長度都為n,求兩個陣列中所有數的上中位數。上中位數 假設遞增序列長度為n,若n為奇數,則上中位數為第n 2 1個數 否則為第n 2個數 要求 時間複雜度為o logn 額外空間複雜度為o 1 示例1輸入 1,2,3,4 3,4,5,6 返回...