尋找兩個有序陣列的中位數 python實現

2021-09-23 06:17:18 字數 2337 閱讀 6598

時間複雜度為: o(log(m , n))

# -*- coding: utf-8 -*-

"""給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。

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

你可以假設 nums1 和 nums2 不會同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

則中位數是 (2 + 3)/2 = 2.5

@author: xiaozuo

"""# left_a | right_a

# a[0], a[1], ..., a[i-1] | a[i], a[i+1], ..., a[m-1]

# i m-i

# left_b | right_b

# b[0], b[1], ..., b[j-1] | b[j], b[j+1], ..., b[n-1]

# j n-j

# left_part | right_part

# a[0], a[1], ..., a[i-1] | a[i], a[i+1], ..., a[m-1]

# b[0], b[1], ..., b[j-1] | b[j], b[j+1], ..., b[n-1]

# i+j m-i + n-j

def median(a, b):

# m ,n為兩個陣列的長度

m, n = len(a), len(b)

if m > n:

a, b, m, n = b, a, n, m

# n是較大的那個陣列的長度

if n == 0:

raise valueerror

# [0, m]區間進行查詢

imin, imax = 0, m

# 假設 i+j = m-i + n-j

# 如果n>=m了就說明n陣列比m陣列長 那就在n-j那一部分+1 於是: i+j = m-i + n-j+1

# 於是化簡得到 j = ((m+n+1)/2) - i

half_len =int((m + n + 1) / 2) # 注意要整形,不然沒辦法查詢 注意int(5/2)=2

while imin <= imax:

i = int((imin + imax) / 2)

j = half_len - i

# i>m right就為負了

if i < m and b[j-1] > a[i]:

# 說明a[i]太小了

imin = i + 1

# i<0 更不可能...

elif i > 0 and a[i-1] > b[j]:

# 說明a[i-1]太大了

imax = i - 1

else:

# 這個時候第乙個條件就完成了 進入到第二個條件

# 極限思想去考慮邊界情況

if i == 0:

max_of_left = b[j-1]

elif j == 0:

max_of_left = a[i-1]

# 這個是一般情況 二選一

else:

max_of_left = max(a[i-1], b[j-1])

# 如果是奇數的話 直接返回就行了

if (m + n) % 2 == 1:

return max_of_left

# 偶數的話右邊也要算

if i == m:

min_of_right = b[j]

elif j == n:

min_of_right = a[i]

else:

min_of_right = min(a[i], b[j])

return (max_of_left + min_of_right) / 2.0

if __name__ == '__main__':

a = [1, 2]

b = [3, 4]

ans = median(a, b)

print(ans)

尋找兩個有序陣列的中位數

尋找兩個有序陣列的中位數 user hihone date 2019 1 31 time 16 32 description 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 ...

尋找兩個有序陣列的中位數

思路 將兩個陣列排序,然後判斷陣列長度,長度為單數,則取二分之一處的數,否則取二分之一處和二分之一減一處的數之和除以2.var findmediansortedarrays function nums1,nums2 var mid math.floor arr.length 2 if arr.len...

尋找兩個有序陣列的中位數

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