zoukankan      html  css  js  c++  java
  • 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)
    

      

  • 相关阅读:
    论二级域名收集的各种姿势
    我喜欢你是寂静的-聂鲁达
    早晨充满-聂鲁达
    KALI Linux更新源
    lodash throttle和debounce
    lodash capitalize 首字母大写
    C# 格式化百分比
    c# PadLeft,PadRight用法
    对象名 XXX 无效。
    lambda 分组后的count
  • 原文地址:https://www.cnblogs.com/zhuangzi101/p/12323796.html
Copyright © 2011-2022 走看看