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

2021-10-19 14:18:02 字數 2000 閱讀 5535

題目描述

給定兩個有序陣列arr1和arr2,已知兩個陣列的長度都為n,求兩個陣列中所有數的上中位數。

上中位數:假設遞增序列長度為n,若n為奇數,則上中位數為第n/2+1個數;否則為第n/2個數

[要求]

時間複雜度為o(logn),額外空間複雜度為o(1)

示例1輸入

[1,2,3,4],[3,4,5,6]
返回值

3
說明

總共有8個數,上中位數是第4小的數,所以返回3。
示例2

輸入

[0,1,2],[3,4,5]
返回值

2
說明

總共有6個數,那麼上中位數是第3小的數,所以返回2
備註:

1 \leq n \leq 10^51≤n≤105

0 \leq arr_, arr_ \leq 10^90≤arr1i​,arr2i​≤109

解題思路:

如果每個陣列中只有乙個元素,較小的那個元素就是整體的上中位數,如果兩個元素相等,隨便返回哪個都可以。

如果陣列中不止乙個元素,找到兩個陣列的中間位置mid1和mid2。

如果arr1[mid1] == arr2[mid2],不管每個陣列中元素的個數是奇數還是偶數,這兩個數都可以是整體的上中位數,返回其中乙個就可以。

如果arr1[mid1] > arr2[mid2],每個陣列的個數是奇數的情況下:陣列arr1中mid1位置以後的數都不可能是整體的上中位數,陣列arr2中mid2位置以前的數都不可能是整體的上中位數。所以現在只需要考慮arr1[left1…mid1]、arr2[mid2…right2],這兩部分的元素個數相同,它們的上中位數就是整體的上中位數。

如果arr1[mid1] > arr2[mid2],每個陣列的個數是偶數的情況下:陣列arr1中mid1位置以後的數都不可能是整體的上中位數,陣列arr2中mid2位置以後包括mid2位置,都不可能是整體的上中位數。所以現在只需要考慮arr1[left1…mid1]、arr2[mid2+1…right2],這兩部分的元素個數相同,它們的上中位數就是整體的上中位數。

arr1[mid1] < arr2[mid2]的情況,分析同上。

python**:

#

# find median in two sorted array

# @param arr1 int整型一維陣列 the array1

# @param arr2 int整型一維陣列 the array2

# @return int整型

#class solution:

def findmedianintwosortedaray(self , arr1 , arr2 ):

# write code here

start1, end1 = 0, len(arr1)-1

start2, end2 = 0, len(arr2)-1

while start1 < end1:

mid1 = (start1 + end1) // 2

mid2 = (start2 + end2) // 2

if (end1-start1+1) % 2 == 0:

offset = 1

else:

offset = 0

if arr1[mid1] == arr2[mid2]:

return arr1[mid1]

elif arr1[mid1] > arr2[mid2]:

end1 = mid1

start2 = mid2 + offset

else:

end2 = mid2

start1 = mid1 + offset

return min(arr1[start1], arr2[start2])

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

給定兩個有序陣列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,...

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

在兩個長度相等的排序陣列中找到上中位數 給定兩個有序陣列arr1和arr2,已知兩個陣列的長度都為n,求兩個陣列中所有數的上中位數。上中位數 假設遞增序列長度為n,若n為奇數,則上中位數為第n 2 1個數 否則為第n個數 要求 時間複雜度為o l ogn o logn o logn 額外空間複雜度為...

求兩個長度相等的排序陣列的上中位數

給兩個排序好的整數陣列,陣列的長度是相同的,找到這兩個陣列的上中位數,也就是如果陣列是偶數的話,輸出前乙個中位數。時間複雜度o logn 空間複雜度o 1 public class upmedian if arr1.length arr2.length int start1 0 int end1 a...