leecode 中位数(python)

题目:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。  请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n))。

题目分析:1.数组是有序数组  2.满足复杂度为log级别  难度主要在于log级别的时间复杂度

解决方案:

方案一:利用sorted将两个数组进行排序处理,再分为奇偶两种情况处理。优点:代码简单,易于理解;缺点:数据量增大可能会导致复杂度不满足要求

方案二:参考https://leetcode.com/problems/median-of-two-sorted-arrays/discuss/2481/Share-my-O(log(min(mn))-solution-with-explanation 的解决办法

自我理解:中位数:以其为分界点将数组分为两个等长的部分,其中一个部分一定大于另外一个部分

1.将nums1和nums2分别以i和j位置进行截取为两段。

           left                  ||           right                                            left                   ||           right

nums1[0]...nums1[i-1];  nums1[i]...nums1[m-1]               nums2[0]...nums1[j-1];  nums2[j]...nums1[n-1]

(1)i + j == m+n-i-j    (or: m - i + n - j + 1  考虑到若两个数组和为奇数情况,左边会比右边多1) 

if n >= m, we just need to set: i = 0 ~ m, j = (m + n + 1)/2 - i(条件合并,考虑偶数情况进行取整处理以后并不影响,相当于j=(m+n)/2-i)

由于 0 <= i <= m ,为了保证 0 <= j <= n ,我们必须保证 m <= n 。

(2)nums1[i-1] <= nums2[j] and nums2[j-1] <= nums1[i-1]

分情况考虑:(1)nums1[i-1]<=nums2[j]:j!=0,i!=m  (2)nums1[i-1]>=nums2[j-1]:i!=0,j!=n

增加i的方式:减半找中间

代码(python)

猜你喜欢

转载自www.cnblogs.com/catherinezll/p/9375543.html