zoukankan      html  css  js  c++  java
  • leetcode2

    问题描述: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)
  • 相关阅读:
    快速击键(MyEclipse编写的QuickHit项目)
    Java语言中的修饰符
    Java中的接口
    建造者模式应用场景
    原型设计模式
    转:fortios 5.4后门植入
    转:json注入
    linux tips
    资料收集
    转:nginx+CGI/FASTCGI
  • 原文地址:https://www.cnblogs.com/tbgatgb/p/10851002.html
Copyright © 2011-2022 走看看