給乙個鍊錶陣列,其中每個鍊錶都已經按照公升序排列,將所有鍊錶合併到乙個鍊錶中並返回。
eg.
輸入:lists = [[1,4,5],[1,3,4],[2,6]]
輸出:[1,1,2,3,4,4,5,6]
解釋:鍊錶陣列如下:
[1->4->5,
1->3->4,
2->6
]將它們合併到乙個有序鍊錶中得到。
1->1->2->3->4->4->5->6
本題類似昨天的21題,合併兩個公升序鍊錶,區別只是鍊錶的數量。所以我第一反應是用類似昨天兩兩比對的方式,嘗試解題,具體的做法是:
按照這個思路解題並提交後,發現特別費時,分析下來,時間複雜度是o(mn),m為鍊錶數量,n為鍊錶平均長度。
這樣的方法效率比較低,參考題解後學習了歸併的方法,思路比較簡單,每次合併兩條鍊錶,直至最後合成一條。
換句話說,可理解為從上而下的合併任務拆分,需要定義乙個類似於21題中合併兩個鍊錶的函式。
定義乙個合併兩個鍊錶的函式
def
mergetwolists
(l1:listnode,l2:listnode)
: a=b=listnode(
none
)while l1 and l2:
if l1.valb.
next
=l1 l1=l1.
next
else
: b.
next
=l2 l2=l2.
next
b=b.
next
if l1:
b.next
=l1 if l2:
b.next
=l2 return a.
next
**
def
mergeklists
(self, lists: list[listnode])-
> listnode:
n=len
(lists)
if n==0:
return
none
elif n==1:
return lists[0]
m=n//
2#利用歸併思想,從中間一分為二
return mergetwolists(self.mergeklists(lists[
:m])
,self.mergeklists[
:m])
可以利用python自帶的heapq將所有元素構建最小堆,思路比較簡單:
將所有鍊錶節點的值全部儲存到最小堆中
對最小堆進行pop操作,每取出乙個值就加到新鍊錶後,直至所有元素取出
if
not lists:
return
none
import heapq
heap=
for node in lists:
while node:
node=node.
next
a=b=listnode(
none
)while heap:
b.next
) b=b.
next
return a.
next
看到一種解法,暴力求解,將所有鍊錶節點放到乙個list中,然後依據節點值進行排序,最後把每個節點接到上個節點後
#合併後排序(暴力求解)
helper=
for li in lists:
while li:
li=li.
next
helper=
sorted
(helper,key=
lambda x:x.val)
ifnot helper:
return
none
for i in
range
(len
(helper)-1
):helper[i]
.next
=helper[i+1]
return helper[
0]
給定乙個排序陣列,在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
要求:不要使用額外的陣列空間,你必須在 原地修改輸入陣列並在使用 o(1) 額外空間的條件下完成。
思路:遍歷陣列,每次把新出現的數塞到第n個位置,輸出n+1,主要**如下:
n=
0#第乙個數作為比較值
for i in
range(1
,len
(nums)):
if nums[i]
!=nums[n]
: n+=
1 nums[n]
=nums[i]
#更新比較值
return n+
1
公升序排列的整數陣列 nums 在預先未知的某個點上進行了旋轉(例如, [0,1,2,4,5,6,7] 經旋轉後可能變為 [4,5,6,7,0,1,2] )。
請你在陣列中搜尋 target ,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。
用二分法把陣列一分為二,取頭、中、尾三個數進行比較,
否則右邊是公升序的,判斷target是否在這個區間
if
not nums:
return-1
left=
0right=
len(nums)-1
while left<=right:
mid=
(left+right)//2
if nums[mid]
==target:
return mid
if nums[left]
<=nums[mid]
:if nums[left]
<=target: right=mid-
1else
: left=mid+
1else
:if nums[mid]
: left=mid+
1else
: right=mid-
1return
-1
java學習筆記day5
面向過程 強調的是功能行為 物件導向 將功能封裝進物件,強調具備了功能的物件。面向過程 開啟冰箱 儲存進冰箱 關閉冰箱 物件導向 冰箱.開啟 冰箱.儲存 冰箱.關閉 物件導向 3個特徵 封裝 繼承 多型。找物件,建立物件,使用物件。維護物件的關係。類 描述。物件 實體。成員變數和區域性變數 作用範圍...
python學習筆記 day5
函式 返回值 描述 pow x,y x y 運算後的結果 sqrt x 返回 x 的平方根 abs x 返回數字的絕對值,如 abs 10 返回 10 fabs x 返回數字的絕對值,如 math.fabs 10 返回 10.0 ceil x 返回數字的上入整數,入 math.ceil 4.1 返回...
matlab cody學習筆記 day5
一些學習筆記 1 陣列的簡單賦值 例如 input n 5 output m is 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25 兩個迴圈的源 function m timestables n m ones n,n for i...