力扣學習筆記 day5

2021-10-16 03:43:46 字數 3317 閱讀 3652

給乙個鍊錶陣列,其中每個鍊錶都已經按照公升序排列,將所有鍊錶合併到乙個鍊錶中並返回。

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...