1、題目描述
給定兩個大小為 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
2、題解
2.1、解法一
原理:將nums1和nums2按照由小到大的順序合並到nums數組中
算法的時間復雜度: O(m)或O(n)
class Solution: def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ l1 = len(nums1) l2 = len(nums2) print(nums1,nums2) nums = [] if l1 and l2: if nums1[l1-1] <= nums2[0]: nums.extend(nums1) nums.extend(nums2) elif nums2[l2-1] <= nums1[0]: nums.extend(nums2) nums.extend(nums1) else: index1 = 0 index2 = 0 while True: if index1+1 > l1: nums.extend(nums2[index2:]) break if index2+1 > l2: nums.extend(nums1[index1:]) break if nums1[index1] <= nums2[index2]: nums.append(nums1[index1]) index1 += 1 else: nums.append(nums2[index2]) index2 += 1 elif l1>0 and l2 == 0: nums = nums1 elif l1 == 0 and l2 >0: nums = nums2 print(nums) l3 = len(nums) if l3% 2 == 1: mid = int(l3/2) ret = nums[mid] else: mid = int(l3/2 -1) ret = (nums[mid] + nums[mid+1])/2 return ret
2.2、解法二
原理:將nums1和nums2合並后排序,然后求中位數
算法的時間復雜度: O(m+(m+n)log(m+n))
class Solution: def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ nums = nums1.extend(nums2) s = sorted(nums) if len(s) %2 == 1: ret = s[int(len(s)/2)] else: mid = int(len(s)/2 -1) ret = (s[mid] + s[mid+1])/2 return ret