leetcode2

寵の児 提交于 2020-01-04 01:19:52

问题描述: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)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!