【Leetcode】Python實現兩個排序陣列的中位數
阿新 • • 發佈:2019-01-08
當兩個數組合並後的總元素長度是奇數時,中位數的下標是n/2。
當兩個數組合並後的總元素個數是偶數時,中位數是下標n/2-1和下標n/2兩個元素的平均值。
所以不論總長度的奇偶性,可以將n/2作為右中位數,n/2-1作為左中位數,當總長度是奇數時,不使用左中位數。但是必須要找到第n/2+1個元素。
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
# 判斷傳入陣列是否為空
if nums1 is None or nums2 is None:
return
# 求出陣列nums1、nums2的長度
nums1_length = len(nums1)
nums2_length = len(nums2)
# 求出兩個陣列的總長度
total_length = nums1_length + nums2_length
# 判斷是否小於0
if total_length == 0:
return
# 如果陣列nums2傳入為空,則重新呼叫查詢中位數,調換引數位置,陣列nums1的位置是允許為空的
if nums2_length == 0:
return self.findMedianSortedArrays(nums2, nums1)
left = -1
right = -1
nums1_Start = 0
nums2_Start = 0
# 迴圈遍歷總長度一半,+1是因為range取不到總長度一半
for i in range(int(total_length/2 )+1):
# left記錄上一次迴圈的right值
left = right
# 如果nums1的記錄點小於nums1的長度 並 (nums2的記錄點大於等於nums2的長度 或 nums1的記錄點的值 小於 nums2記錄點的值)
if nums1_Start < nums1_length and (nums2_Start >= nums2_length or nums1[nums1_Start] < nums2[nums2_Start]):
# 給right賦值 nums1的記錄點的值,然後讓nums1記錄點加1
right = nums1[nums1_Start]
nums1_Start += 1
else:
# 給right賦值 nums2的記錄點的值,然後讓nums2記錄點加1
right = nums2[nums2_Start]
nums2_Start += 1
# 如果總長度 & 1 為 0 ,則使用兩個數除2,即判斷total_length是否為偶數
# 也可使用total_length % 2 == 0這種判斷,但是使用&號效能稍高一點
if (total_length & 1) == 0:
return (left+right)/2.0
else:
# 使用除於1.0是為了讓結果為浮點數
return right/1.0
if __name__ == '__main__':
# nums1 = [1, 3]
# nums2 = [2]
nums1 = [1, 2]
nums2 = [3, 4]
s = Solution()
median_num = s.findMedianSortedArrays(nums1, nums2)
print(median_num)