zoukankan      html  css  js  c++  java
  • 求两个有序数组中位数-python3.6


    题目描述:Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 of size m and n respectively.

    Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

    题目是《算法导论》上的一道习题,不过已多次出现在面试题当中。注意,此题中两个数组的长度是相等的。当然,长度不等的话也可以做,只是要多些判断条件。参考leetcode题目 Median of Two Sorted Arrays

    方法1 直接遍历

    直接的解法是遍历两个数组并计数,类似归并排序里面的有序数组的合并,复杂度为O(n)。代码如下:

     1 def getMedian(nums1, nums2, n):
     2   ans1, ans2 = -1, -1
     3   i = j = 0
     4   for count in range(n+1):
     5     if i < n and (nums1[i] < nums2[j] or j >= n):
     6       ans1 = ans2
     7       ans2 = nums1[i]
     8       i += 1
     9     else :
    10       ans1 = ans2
    11       ans2 = nums2[j]
    12       j += 1
    13   return (ans1 + ans2)/2.0
    14 
    15 if __name__ == '__main__':
    16   nums1 = [1, 12, 15, 26, 38]
    17   nums2 = [2, 13, 17, 30, 45]
    18   n1 = len(nums1)
    19   n2 = len(nums2)
    20   if n1 == n2:
    21     print("Median is %s", getMedian(nums1, nums2, n1))
    22   else:
    23     print("Can't work for nums of unequal size")

    方法2 分治法

    需要用分治法求解,时间复杂度为O(log (m+n))。

    1.假设数组A的中位数为m1,数组B为m2,例如:nums1 = {1, 12, 15, 26, 38}, nums2 = {2, 13, 17, 30, 45},m1 = 15 ,m2 = 17 。

    2.由于m1<m2,则可以确定中位数即为下面两个子数组的中位数 :[15, 26, 38]  和 [2, 13, 17]

    3.重复步骤1、2,可以得到   m1 = 26, m2 = 13. 得到两个子数组:[15, 26] 和[13, 17]

    4.这时,由于n=2,无法在继续分下去了。可以直接计算得:

    median = (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1]))/2
    = (max(15, 13) + min(26, 17))/2 
    = (15 + 17)/2
    = 16

    代码如下:

     1  def median(nums, n):
     2 
     3   if n%2 == 0:
     4     return (nums[n//2] + nums[n//2-1])/2.0
     5   else:
     6     return nums[n//2]
     7 
     8 def getMedian(nums1, nums2, n):
     9   m1, m2 = -1, -1
    10   if n <= 0:
    11     return -1
    12   elif n == 1:
    13     return (nums1[0] + nums2[0]) / 2
    14   elif n == 2:
    15     return (max(nums1[0], nums2[0]) + min(nums1[1], nums2[1])) / 2
    16   m1 = median(nums1, n)
    17   m2 = median(nums2, n)
    18   # /* 相等可直接返回 */
    19   if m1 == m2:
    20     return m1
    21   if m1 < m2:
    22     if n%2 == 0:
    23       return getMedian(nums1[n//2-1:], nums2[:n//2+1], n//2 + 1)
    24     else:
    25       return getMedian(nums1[n//2:], nums2[:n//2+1], n//2 + 1)
    26   else:
    27     if n%2 == 0:
    28       return getMedian(nums2[n//2-1:], nums1[:n//2+1], n//2 + 1)
    29     else:
    30       return getMedian(nums2[n//2:], nums1[:n//2+1], n//2 + 1)
    31 
    32 if __name__ == "__main__":
    33   nums1 = [1, 12, 15, 26, 38]
    34   nums2 = [2, 13, 17, 30, 45]
    35   n1 = len(nums1)
    36   n2 = len(nums2)
    37   if n1 == n2:
    38     print("Median is %s", getMedian(nums1, nums2, n1))
    39   else:
    40     print("Doesn't work for arrays of unequal size")
  • 相关阅读:
    Android开发 ViewConfiguration View的配置信息类
    Android 开发 倒计时功能 转载
    Android 开发 关于7.0 FileUriExposedException异常 详解
    Android 开发 实现文本搜索功能
    Android 开发 Activity里获取View的宽度和高度 转载
    Android 开发 存储目录的详解
    Android 开发 Fresco框架点击小图显示全屏大图实现 ZoomableDraweeView
    Android 开发 将window变暗
    Android 开发 DisplayMetrics获取Android设备的屏幕高宽与其他信息
    Android 开发 DP、PX、SP转换详解
  • 原文地址:https://www.cnblogs.com/mayunting/p/8241982.html
Copyright © 2011-2022 走看看