寫在前邊:
小詹一直覺得自己程式設計能力不強,想在網上刷題,又怕不能堅持。不知道有木有和小夥伴和小詹一樣想找個人一起刷題呢?歡迎和小詹一起定期刷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篇打卡記錄,都說三分鐘熱度,我看還有多少人堅持哈,還在堅持一起打卡的點個讚唄?
歡迎各種姿勢的轉發分享,讓更多小夥伴加入打卡大家庭噢~