在兩個長度相等的排序陣列中找到上中位數

2021-10-02 18:51:36 字數 2653 閱讀 3497

給定兩個有序陣列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] = 4m1-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 返回...