拿什麼拯救你,我的offer!(從零打卡刷leetcode,No.004)

小詹學Python發表於2018-06-06

寫在前邊:

小詹一直覺得自己程式設計能力不強,想在網上刷題,又怕不能堅持。不知道有木有和小夥伴和小詹一樣想找個人一起刷題呢?歡迎和小詹一起定期刷leetcode,每週一週五更新一題,每一題都吃透,歡迎一題多解,尋找最優解!歡迎小夥伴們把自己的思路在留言區分享出來噢

往期回顧:

【記錄帖】(No.003)從零打卡刷Leetcode

【記錄帖】(No.002)從零打卡刷Leetcode

【記錄帖】(No.001)從零打卡刷Leetcode

No.4 Median of Two Sorted Arrays

原題:

There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n))..

題目大意:給出兩個有序的數字列表,長度分別為m,n。找到這兩個列表中的中間值。(第一次除了了時間複雜度的要求噢)

例如:

#例子一:總長度為奇數
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
#例子二:總長度為偶數
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
複製程式碼

仔細分析題目,nums1和nums2都已經是排好序了的,這就大大的降低了難度,讓找到兩個列表的中間值,其實我們可以擴充為找到兩個列表的第k個值。當然這個是擴充部分了,對於這個題目,有不同的思路,最簡單粗暴的就是將兩個列表合併,之後進行排序,拍好序後進行尋找中間值就簡單了。但是用傳統的先合併再排序,效率想必會很低~

我們發現對於兩個已經有序的列表(從小到大),其實有一個更優的排序方式:從小到大,依次進行列表元素的比較(為方便表述,小詹稱兩個列表為A,B),較小值放到一個新列表中,比如A中該位置的值較小,將其放到新的列表C中,同時將A列表下一個值繼續與B中當前位置元素進行比較,以此類推。這樣的比較次數就比先合併在排序小很多啦!程式碼如下:

def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        #建立新列表,並將所有元素初始為0
        nums3 = [0] * (len(nums1)+len(nums2))
        #指定三個列表的索引,初始值為0
        l_i,r_i,i = 0,0,0
        #當輸入兩個列表都還存在元素沒進行比較的時候,迴圈進行對比
        #並將較小值放入新列表,同時較小元素的列表和新列表索引加一
        while(l_i < len(nums1)) and (r_i < len(nums2)):
            if nums1[l_i] < nums2[r_i]:
                nums3[i] = nums1[l_i]
                l_i += 1
            else:
                nums3[i] = nums2[r_i]
                r_i += 1
            i += 1
        #當存在某一個列表所有元素已經比較完,即拍好了序
        #剩下那個列表剩下的值直接放入新列表對應位置即可
        if l_i != len(nums1):
            nums3[i:] = nums1[l_i:]
        else:
            nums3[i:] = nums2[r_i:]
        #小詹有話說:注意‘/’和‘//’的區別
        #前者結果為float型別,後者為整除,結果為int型
        len_3 = len(nums3)
        #‘%’為取模運算,即看長度是否被2整除,即看偶數還是奇數
        if len_3 %2 != 0:
            return float(nums3[(len_3-1)//2])
        return (nums3[len_3//2 - 1]+nums3[len_3//2])/2
複製程式碼

程式碼裡,小詹已經新增了十分詳細的註釋,配上思路分析應該沒有問題啦!這是第4篇打卡記錄,都說三分鐘熱度,我看還有多少人堅持哈,還在堅持一起打卡的點個讚唄?

歡迎各種姿勢的轉發分享,讓更多小夥伴加入打卡大家庭噢~

拿什麼拯救你,我的offer!(從零打卡刷leetcode,No.004)



相關文章