力扣刷题 4. 寻找两个正序数组的中位数

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

          两种方法都能通过,但是排序的复杂度肯定不满足题目要求的。第二种我不知道是不是满足了复杂度要求,代码有点多,不过也还容易能看懂喽

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        # reslist = nums1
        # reslist.extend(nums2) #合并数组,extend()函数无返回值,谨记
        # reslist.sort()   #排序
        # n=len(reslist)
        # if n%2==0:    #找中位数
        #     return (reslist[n//2-1]+reslist[n//2])/2
        # else:
        #     return reslist[n//2]
        #这个复杂度有点高,不满足O(log(m+n))

        m,n=len(nums1),len(nums2)
        i, j = 0, 0
        cout = -1
        if (m+n)%2==0:   #合并后的长度是偶数
            left_index = (m+n)//2-1           #确认左右的下标是多少
            right_index = (m+n)//2
            while cout<=right_index:          #直到找到右下标这么多
                if i<m and j<n:               #两个数组都还有数那就要做一点比较,小的往后移,同时判断个数有没有到左下标和右下标,做记录
                    if nums1[i]>nums2[j]:
                        cout +=1
                        if cout==left_index:  #如果已经找到了左下标,那要记录一下
                            left=nums2[j]
                        if cout==right_index: #如果已经找到了右下标,那可以配合左下标返回了
                            right=nums2[j]
                            return (left+right)/2
                        j +=1
                    else:
                        cout +=1
                        if cout==left_index:
                            left=nums1[i]
                        if cout==right_index:
                            right=nums1[i]
                            return (left+right)/2
                        i +=1
                elif j<n:    #只有nums2有数字了
                    cout +=1
                    if cout==left_index:
                        left=nums2[j]
                    if cout==right_index:
                        right=nums2[j]
                        return (left+right)/2
                    j +=1
                else:         #只有nums1有数字了
                    cout +=1
                    if cout==left_index:
                        left=nums1[i]
                    if cout==right_index:
                        right=nums1[i]
                        return (left+right)/2
                    i +=1
        else:                  #合并后的长度是奇数
            mid=(m+n)//2       #确认中位数下标
            while cout<=mid:
                if i<m and j<n:
                    if nums1[i]>nums2[j]:
                        cout +=1
                        if cout==mid:
                            return nums2[j]
                        j +=1
                    else:
                        cout +=1
                        if cout==mid:
                            return nums1[i]
                        i +=1
                elif j<n:
                    cout +=1
                    if cout==mid:
                        return nums2[j]
                    j +=1
                else:
                    cout +=1
                    if cout==mid:
                        return nums1[i]
                    i +=1
posted on 2021-06-11 09:13  雾恋过往  阅读(34)  评论(0)    收藏  举报

Live2D