【算法训练】LeetCode#4 寻找两个正序数组的中位数

一、描述

寻找两个正序数组的中位数

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数

算法的时间复杂度应该为 O(log (m+n))

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

二、思路

不考虑时间复杂度的前提下,可以直接将两个数组合到一起再找到中位数,当然了,既然题中给了时间复杂度,那就是不希望这么做。

先计算出两个数组的长度,然后就知道了中位数出现在第几位,然后再逐位合并数组,当合并到目标位时就可以计算中位数了。

哦,其实不需要真做合并操作,找到目标位即可。

三、解题

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        # 获得长度
        m = len(nums1)
        n = len(nums2)
        # 判断是否需要求平均
        if (m+n)%2 == 0:
            flag = True
            middleLoc = (m+n)/2
        else:
            flag = False
            middleLoc = int((m+n)/2)+1
        loc1,loc2 = -1,-1
        sumLoc = 0
        judWho = 0 # 根据这个判断哪一位是新的
        returnNum = 0
        while True:
            # 任意一个数组没有合并完成时
            if loc1 != m-1 and loc2 != n-1:
                if nums1[loc1+1] < nums2[loc2+1]:
                    loc1 += 1
                    judWho = 1
                else:
                    loc2 += 1
                    judWho = 2
            else:
                # 逻辑上有一个数组合并完成了
                if loc1 == m-1:
                    loc2 += 1
                    judWho = 2
                else:
                    loc1+= 1
                    judWho = 1
            sumLoc += 1

            if flag == True and sumLoc == middleLoc:
                returnNum += (nums1[loc1] if judWho == 1 else nums2[loc2])
            if flag == True and sumLoc == middleLoc+1:
                returnNum += (nums1[loc1] if judWho == 1 else nums2[loc2])
                break
            if flag == False and sumLoc == middleLoc:
                returnNum += (nums1[loc1] if judWho == 1 else nums2[loc2])
                break
        return returnNum/2 if flag else returnNum
posted @ 2022-11-22 13:06  小拳头呀  阅读(15)  评论(0编辑  收藏  举报