Leetcode 四、寻找两个正序数组的中位数

题目

给定两个大小为m和n的正序(从小到大)数组num1和num2
请找出两个正序数组的中位数,并且要求算法的时间复杂度为O(log(m + n))。

时间复杂度

    时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
    若算法的T(n) =O(logn),则称其具有对数时间。由于计算机使用二进制的记数系统,对数常常以2为底(即log2n,有时写作lgn)。然而,由对数的换底公式,logan和logbn只有一个常数因子不同,这个因子在大O记法中被丢弃。因此记作O(logn),而不论对数的底是多少,是对数时间算法的标准记法。
   常见的具有对数时间的算法有二叉树的相关操作和二分搜索。
   对数时间的算法是非常有效的,因为每增加一个输入,其所需要的额外计算时间会变小。
   针对本题的时间复杂度,选用二分法

思路

1.将两个数组合并为一个数组,并进行排序,从而找到中位数(不符合时间复杂度)
2.先寻找两个数组中各自的中位数,然后进行比较,哪个数小就向后一位移动,知道最后能够到达     (m+n)/2 个数,即为所求中位数。(不符合时间复杂度)
3.二分法,最早接触是在数学中寻找函数零点,两个区间逐渐逼近,最终得到了零点值。二分法也用于对排好序的数组进行查找,在本题中,也利用了二分法寻找第(m+n)/2或者(m+n)/2+1个数,因为是两个数组,所以寻找每个数组中第(m+n)/4或者(m+n)/4+1个数,具体解释及问题可参考https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-s-114/

程序

class Solution:  
  def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:                 
      def getKthElement(k):          
          index1, index2 = 0, 0           
           while True:              
             # 特殊情况              
               if index1 == m:                   
                   return nums2[index2 + k - 1]               
               if index2 == n:                   
                   return nums1[index1 + k - 1]              
               if k == 1:                   
                   return min(nums1[index1], nums2[index2])
                # 正常情况         
                newIndex1 = min(index1 + k // 2 - 1, m - 1)           
                newIndex2 = min(index2 + k // 2 - 1, n - 1)                
                pivot1, pivot2 = nums1[newIndex1], nums2[newIndex2]                
                if pivot1 <= pivot2:                 
                   k -= newIndex1 - index1 + 1                  
                   index1 = newIndex1 + 1                
                else:                  
                  k -= newIndex2 - index2 + 1                   
                  index2 = newIndex2 + 1                
       m, n = len(nums1), len(nums2)         
       totalLength = m + n         
       #判定m+n的奇偶性
       if totalLength % 2 == 1:             
           return getKthElement((totalLength + 1) // 2)       
       else:             
           return (getKthElement(totalLength // 2) + getKthElement(totalLength // 2
           + 1)) / 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值