leetcode题 寻找两个有序数组的中位数
Posted 桩子101
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode题 寻找两个有序数组的中位数相关的知识,希望对你有一定的参考价值。
题目描述:
我的成绩:
成绩不是很好,代码本身写的也很乱,本文只是提供一种解题思路。
题目分析:
要求两有序数组的中位数并不难,简单粗暴的方法就是得到两数组合并后的新数组,取其中位数即可,但是难度在于这个时间复杂度有限制,为 O(log(m + n))。
一看这个log,那么很容易想到二分查找算法什么的,而本文的解题过程也正是按照二分的思路来的。通过每次比较两数组的二分位点,来进行中位数的筛选。
解题步骤:
例:有两有序数组L1=[1, 2, 6, 12, 34, 36, 39, 43, 51, 56],L2=[2, 11, 14, 45, 48, 49],要求中位数 。
设L为L1和L2合并后的有序数组。那么可以看出我们要找的中位数在L中的下标应为7、8
Python代码实现:
代码实现过程有点曲折,经过几次提交修修补补形成了以下这段代码,写的不太好,理解了以上的思路后大家可以自己实现。
class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: l1 = nums1 l2 = nums2 m1 = (len(l1)+len(l2))//2 m2 = (len(l1)+len(l2))/2 m_idx = [m1-1, m1] if m1 == m2 else [m1] be_num = m1 - (len(m_idx) - 1) af_num = be_num while be_num > 0 and af_num > 0 and len(l1) != 0 and len(l2) != 0: low1, high1, low2, high2 = 0, len(l1) - 1, 0, len(l2) - 1 mid1 = (low1+high1)//2 mid2 = (low2+high2)//2 if l1[mid1] < l2[mid2]: low1 = max(min(mid1 + m_idx[0]-(mid1+mid2), len(l1)-1,mid1+1), 0) be_num -= low1 high2 = max(min(mid2 + m_idx[-1] - (mid1 + mid2 + 1), len(l2) - 1), mid2-1) af_num -= len(l2) - high2 - 1 else: low2 = max(min(mid2 + m_idx[0] - (mid1 + mid2), len(l2)-1, mid2+1), 0) be_num -= low2 high1 = max(min(mid1 + m_idx[-1] - (mid1 + mid2 + 1), len(l1) - 1), mid1-1) af_num -= len(l1) - high1 - 1 l1 = l1[low1:high1+1] l2 = l2[low2:high2+1] m_idx = [be_num] if len(m_idx) == 1 else [be_num, be_num + 1] newList = [] while len(l1) != 0 and len(l2) != 0: if l1[0] < l2[0]: newList.append(l1[0]) l1.remove(l1[0]) else: newList.append(l2[0]) l2.remove(l2[0]) newList.extend(l1) newList.extend(l2) if be_num == 0 and af_num == 0: newList = newList elif be_num == 0 and af_num != 0: newList = newList[:-af_num] elif be_num != 0 and af_num == 0: newList = newList[be_num:] else: newList = newList[be_num:-af_num] # elif be_num == 0: # newList = newList[:-af_num] # elif af_num == 0: # newList = newList[be_num+1:] return sum(newList)/len(newList)
以上是关于leetcode题 寻找两个有序数组的中位数的主要内容,如果未能解决你的问题,请参考以下文章