###### tags: `Leetcode` `hard` `binary search` `python` `Top 100 Liked Questions` # 4. Median of Two Sorted Arrays ## [題目來源:] https://leetcode.com/problems/median-of-two-sorted-arrays/ ## 題目: Given two sorted arrays nums1 and nums2 of size m and n respectively, return **the median** of the two sorted arrays. **The overall run time complexity should be O(log (m+n)).** ## 解題想法: * 要long(m+n): 往二分法去思考 * 因為最終要return找排好的中位數mid ex: n=[1,3] m=[2] -> mid=2 ex: n=[1,3] m=[2,4] ->mid=(2+3)/2= 2.5 * 技巧!! 對於奇偶數均適用: 找(m+n+1)/2、(m+n+2)/2 取和平均 #### [高手完整解析] #https://github.com/grandyang/leetcode/issues/4 ## Python: ``` python= class Solution(object): def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ #技巧:對奇偶均適用:找(m+n+1)/2 (m+n+2)/2 取和平均 m = len(nums1) n = len(nums2) left = (m + n + 1) // 2 right = (m + n + 2) // 2 return float((self.find_k(nums1, 0, nums2, 0, left) + self.find_k(nums1, 0, nums2, 0, right))) / 2 def find_k(self, nums1, i, nums2, j, k): #i為nums1的起始位置 j為nums2的起始位置 #找到第k個元素 #特殊case if i >= len(nums1): #i已超過nums1長度 return nums2[j + k - 1] if j >= len(nums2): #j已超過nums2長度 return nums1[i + k - 1] if k == 1: return min(nums1[i], nums2[j]) #對k二分 分別在nums1、nums2中找k/2個元素: #目的為要在nums1、nums2中淘汰k/2個較小數字 if i + k // 2 - 1 < len(nums1): midVal1 = nums1[i + k // 2 - 1] else: #若個數已經太少 不能淘汰 設無限大避免淘汰 midVal1 = float("inf") if j + k // 2 - 1 < len(nums2): midVal2 = nums2[j + k // 2 - 1] else: midVal2 = float("inf") #二分法 比較兩數組第k/2個小的數字minVal1、2 #若midVal1小 表示要找的數字不在nums1的前k/2個數字 #可以將其淘汰 遞迴: 將nums1的起始位置向後移動k/2個 #將k也減去一半 if midVal1 < midVal2: return self.find_k(nums1, i + k // 2, nums2, j, k - k // 2) else: return self.find_k(nums1, i, nums2, j + k // 2, k - k // 2) result=Solution() ans=result.findMedianSortedArrays(nums1 = [1,2], nums2 = [3,4]) print(ans) ```