尋找兩個正序陣列的中位數-python
阿新 • • 發佈:2021-06-24
# 給定兩個大小分別為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的 中位數 。
#
#
#
# 示例 1:
#
#
# 輸入:nums1 = [1,3], nums2 = [2]
# 輸出:2.00000
# 解釋:合併陣列 = [1,2,3] ,中位數 2
方法:劃分陣列法,時間複雜度O(logmin(m,n))
def findMedianNum(nums1, nums2): """ 參考:https://blog.csdn.net/weixin_42721167/article/details/112637470 :param nums1: :param nums2: :return:""" m = len(nums1) n = len(nums2) MAX_NUM = 10 ** 6 if m > n: return findMedianNum(nums2, nums1) if m == 0: return nums2[n // 2] if n % 2 == 1 else (nums2[n // 2 -1 ] + nums2[(n // 2)]) / 2 if n == 0: return nums1[m // 2] if m % 2 == 1 else (nums1[m // 2 -1] + nums1[(m // 2)]) / 2 left, right= 0, m # 左右指標,尋找劃分點 median1, median2 = 0, 0 # 前後半部分中位數 i, j = 0, 0 # nums1, nums2 劃分點 numsim1, numsi, numsjm1, numsj = 0, 0, 0, 0 while left <= right: print(left) i = (left + right) // 2 j = (m + n + 1) // 2 - i # 要滿足i+j是總長度的一半 # 上下左右四個方位進行控制 numsim1 = (nums1[i - 1] ifi != 0 else -MAX_NUM) numsi = (nums1[i] if i != m else MAX_NUM) numsjm1 = (nums2[j - 1] if j != 0 else -MAX_NUM) numsj = (nums2[j] if j != n else MAX_NUM) if numsim1 <= numsj: median1, median2 = max(numsim1, numsjm1), min(numsi, numsj) left = i + 1 else: right = i - 1 return (median1 + median2) / 2 if (m + n) % 2 == 0 else median1