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题 寻找两个有序数组的中位数的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode]4寻找两个有序数组的中位数

Leetcode 寻找两个有序数组的中位数

Leetcode寻找两个有序数组的中位数

算法实战寻找两个有序数组的中位数

[LeetCode] 4. 寻找两个有序数组的中位数

[LeetCode] 寻找两个有序数组的中位数