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)