題目描述
給定兩個有序陣列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...