1. 程式人生 > 其它 >力扣刷題 4. 尋找兩個正序陣列的中位數

力扣刷題 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