1. 程式人生 > >【Leetcode】Python實現兩個排序陣列的中位數

【Leetcode】Python實現兩個排序陣列的中位數

當兩個數組合並後的總元素長度是奇數時,中位數的下標是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)