1. 程式人生 > >尋找兩個有序陣列的中位數(LeetCode)

尋找兩個有序陣列的中位數(LeetCode)

想法如下:

當數的個數為奇數時,中位數就這一堆已經排好序的數最中間那一個

當數的個數為偶數時,中位數就是中間那兩個數的平均數

class Solution:
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        lis = []#將nums1和nums2重新進行排序放進lis中
        j = 0
        k = 0
        n = len(nums1)
        m = len(nums2)
        if(n == 0):#nums1為空時,直接在num2中返回
            if(m%2==0):
                i = int(m/2)
                return (nums2[i]+nums2[i-1])/2
            else:
                return nums2[int(m/2)]
        elif(m == 0):#同上理
            if(n%2==0):
                i = int(n/2)
                return (nums1[i]+nums1[i-1])/2
            else:
                return nums1[int(n/2)]
        for i in range(0,n+m):#因為nums1和num2已經分別排序好了,所以n+m的複雜度已經夠用
            if(j < n and k < m):#保證下標沒有越界
                if(nums1[j]<=nums2[k]):
                    lis.append(nums1[j])
                    j = j + 1
                else:
                    lis.append(nums2[k])
                    k = k + 1
            elif(j==n):#nums1已經全部放進了lis,現在只需要放nums2就行了
                lis.append(nums2[k])
                k = k + 1
            elif(k==m):#同上理
                lis.append(nums1[j])
                j = j + 1

        if((n+m)%2==0):
            i = int((n+m)/2)
            return (lis[i]+lis[i-1])/2
        else:
            return lis[int(len(lis)/2)]

'''

第一次用LeetCode,不太習慣。然後因為資料型別的問題,困擾了一會。

Python寫程式的毛病多,在IDLE上寫好了,放在LeetCode裡面就會縮排不對。。

然後對比了一下我的答案和官方的答案。

官方給出的時間複雜度是,而我的是O(m+n)

官方給出的時間複雜度是O(1),而我的還是O(m+n)

(看錯題目。。它要求複雜的是O(log(min(m,n)))。。而我就直接做了。。)

可以在兩個數組裡各設定一個從零開始的下標,然後也是通過對比決定下標的移動

當m+n是奇數時,就執行到i<(m+n)/2

當m+n是偶數時,就執行到i<(m+n)/2+1

這樣時間會變短,空間複雜度也下降到O(1)

'''