问题描述:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
给定两个大小为 m 和 n 的有序数组 nums1
和 nums2
。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1
和 nums2
不会同时为空。
代码:
1 class Solution: 2 def findMedianSortedArrays(self, nums1, nums2) -> float: 3 len_nums1, len_nums2 = len(nums1), len(nums2) 4 5 # 如果nums1为空,则中位数由nums2决定 6 if len_nums1 == 0: 7 if len_nums2 % 2 != 0: # nums2的长度为奇数 8 mid_num = float(nums2[(len_nums2-1)//2]) 9 else: # nums2的长度为偶数 10 mid_num = float((nums2[(len_nums2-2)//2] + nums2[len_nums2//2]) / 2) 11 12 # 如果nums2为空,则中位数由nums1决定 13 elif len_nums2 == 0: 14 if len_nums1 % 2 != 0: # nums1的长度为奇数 15 mid_num = float(nums1[(len_nums1-1)//2]) 16 else: # nums1的长度为偶数 17 mid_num = float((nums1[(len_nums1-2)//2] + nums1[len_nums1//2]) / 2) 18 19 # 如果nums1和nums2均非空,则中位数由两个list共同决定 20 else: 21 # 如果nums1仅含有1个元素 22 if len_nums1 == 1: 23 if len_nums2 % 2 != 0: # nums2的长度为奇数 24 mid_num = float((nums2[(len_nums2-1)//2] + nums1[0]) / 2) 25 else: # nums2的长度为偶数 26 mid_num = float((nums2[(len_nums2-2)//2] + nums2[len_nums2//2] + nums1[0]) / 2) 27 28 # 如果nums2仅含有1个元素 29 elif len_nums2 == 1: 30 if len_nums1 % 2 != 0: # nums1的长度为奇数 31 mid_num = float((nums1[(len_nums1-1)//2] + nums2[0]) / 2) 32 else: # nums1的长度为偶数 33 mid_num = float((nums1[(len_nums1-2)//2] + nums1[len_nums1//2] + nums2[0]) / 2) 34 35 # 如果nums1和nums2都至少含有2个元素 36 # 用flag来判断是升序还是降序:1表示升序,0表示降序 37 else: 38 flag1 = 1 if nums1[0] <= nums1[len_nums1-1] else 0 39 flag2 = 1 if nums2[0] <= nums2[len_nums2-1] else 0 40 41 if len_nums1 % 2 != 0: # nums1的长度为奇数 42 mid_num1 = nums1[(len_nums1-1)//2] 43 else: # nums1的长度为偶数 44 mid_num1 = (nums1[(len_nums1-2)//2] + nums1[len_nums1//2]) / 2 45 46 if len_nums2 % 2 != 0: # nums2的长度为奇数 47 mid_num2 = nums2[(len_nums2-1)//2] 48 else: # nums2的长度为偶数 49 mid_num2 = (nums2[(len_nums2-2)//2] + nums2[len_nums2//2]) / 2 50 51 # 记last_len为上一次剩余的区间的长度,初始为原始长度 52 last_len1 = len_nums1 53 last_len2 = len_nums2 54 head1, head2 = 0, 0 55 tail1, tail2 = len_nums1, len_nums2 56 while last_len1 > 0 or last_len2 > 0: 57 # 下一个区间的位置一定是偶区间 58 last_len1 //= 2 59 last_len2 //= 2 60 61 if mid_num1 < mid_num2: 62 # 如果是升序的,list1要往右边的区间找 63 if flag1 == 1: 64 if last_len1 == 0: 65 mid_num1 = nums1[tail1-1] 66 else: 67 mid_num1 = (nums1[tail1-last_len1-1] + nums1[tail1-last_len1]) / 2 68 head1 = tail1 - last_len1 69 tail1 = tail1 70 else: 71 if last_len1 == 0: 72 mid_num1 = nums1[head1] 73 else: 74 mid_num1 = (nums1[head1+last_len1-1] + nums1[head1+last_len1]) / 2 75 head1 = head1 76 tail1 = head1 + last_len1 77 # 如果是升序的,list2要往左边的区间找 78 if flag2 == 1: 79 if last_len2 == 0: 80 mid_num2 = nums2[head2] 81 else: 82 mid_num2 = (nums2[head2+last_len2-1] + nums2[head2+last_len2]) / 2 83 head2 = head2 84 tail2 = head2 + last_len2 85 else: 86 if last_len2 == 0: 87 mid_num2 = nums2[tail2-1] 88 else: 89 mid_num2 = (nums2[tail2-last_len2-1] + nums2[tail2-last_len2]) / 2 90 head2 = tail2 - last_len2 91 tail2 = tail2 92 93 if mid_num1 > mid_num2: 94 # 如果是升序的,list1要往左边的区间找 95 if flag1 == 1: 96 if last_len1 == 0: 97 mid_num1 = nums1[head1] 98 else: 99 mid_num1 = (nums1[head1+last_len1-1] + nums1[head1+last_len1]) / 2 100 head1 = head1 101 tail1 = head1 + last_len1 102 else: 103 if last_len1 == 0: 104 mid_num1 = nums1[tail1-1] 105 else: 106 mid_num1 = (nums1[tail1-last_len1-1] + nums1[tail1-last_len1]) / 2 107 head1 = tail1 - last_len1 108 tail1 = tail1 109 # 如果是升序的,list2要往右边的区间找 110 if flag2 == 1: 111 if last_len2 == 0: 112 mid_num2 = nums2[tail2-1] 113 else: 114 mid_num2 = (nums2[tail2-last_len2-1] + nums2[tail2-last_len2]) / 2 115 head2 = tail2 - last_len2 116 tail2 = tail2 117 else: 118 if last_len2 == 0: 119 mid_num2 = nums2[head2] 120 else: 121 mid_num2 = (nums2[head2+last_len2-1] + nums2[head2+last_len2]) / 2 122 head2 = head2 123 tail2 = head2 + last_len2 124 125 mid_num = (mid_num1 + mid_num2)/2 126 mid_num = float(mid_num) 127 128 return mid_num 129 130 131 # if __name__ == '__main__': 132 # sol = Solution() 133 # y = sol.findMedianSortedArrays([1, 2,3], [2,3,4,5,6]) 134 # print(y)
来源:https://www.cnblogs.com/tbgatgb/p/10851002.html