一枚菜鳥的leetcode刷題筆記 Day5

2021-10-16 03:35:13 字數 3116 閱讀 1278

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。

class

solution

:def

merge2lists

(self, l1, l2)

:'''

l1 and l2 are two linked lists

'''head = listnode(

) rehead = head

while l1 and l2:

if l1.val < l2.val:

head.

next

= l1

l1 = l1.

next

else

: head.

next

= l2

l2 = l2.

next

head = head.

next

if l1:

head.

next

= l1

else

: head.

next

= l2

return rehead.

next

defmergeklists

(self, lists: list[listnode])-

> listnode:

ifnot lists:

return

none

else

: ans = lists.pop(

)while lists:

ans = self.merge2lists(ans, lists.pop())

return ans

先定義乙個函式merge2lists用於合併兩個鍊錶,然後對lists裡的鍊錶兩兩合併。

注意要考慮到lists為空的情況,此時應直接返回none

此題被標記為困難,通過單獨定義乙個函式可以分解問題,以後遇到複雜的問題可以考慮這一點。

給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o(1

)o(1)

o(1)

額外空間的條件下完成。

class

solution

:def

removeduplicates

(self, nums: list[

int])-

>

int:

mark =

0#mark標記的是在彈出元素後當前指標的實際位置

for i in

range

(len

(nums)):

if mark >=

1and nums[mark]

== nums[mark-1]

: nums.pop(mark)

mark -=

1 mark +=

1return mark

因為題目要求只使用 o(1) 額外空間,所以不可能維護乙個要彈出元素下表的列表(要使用o(n

)o(n)

o(n)

的額外空間)。那麼自然想到使用指標。

定義乙個指標mark,mark-1指向的是彈出元素後的列表的當前位置,也就是說,在每一次迴圈完成時,nums[:marker-1]都是無重複的有序列表。

索引i只是記錄迴圈,沒有別的作用,它保證了列表被完整的走完一次。

小細節:要返回的是列表nums的長度,本應是(mark-1)+1:

mark-1是因為最後一次迴圈中的mark += 1已經超出了範圍,所以要-1;

再+1是因為mark是從0開始的,所以應該在索引基礎上+1

公升序排列的整數陣列 nums 在預先未知的某個點上進行了旋轉(例如, [0,1,2,4,5,6,7] 經旋轉後可能變為 [4,5,6,7,0,1,2] )。

請你在陣列中搜尋 target ,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

class

solution

:def

search

(self, nums: list[

int]

, target:

int)

->

int:

ifnot nums:

return-1

l, r =0,

len(nums)-1

while l <= r:

#必須是<=,因為l=r=mid是一種重要的產生返回值的情況

mid =

(l+r)//2

if nums[mid]

== target:

return mid

if nums[l]

<= nums[mid]

:#必須寫成<=,因為l=mid時,[l,mid]只有乙個值但也是有序的

if nums[l]

<= target < nums[mid]

:#不能寫成nums[l]<=target<=nums[mid-1],因為可能mid=l(==0)

r = mid -

1else

: l = mid +

1else

:if nums[mid]

< target <= nums[r]

: l = mid +

1else

: r = mid -

1return

-1

參考了官方解答

l和r指標維護的是當前判斷的target的左右邊界,mid是二分點。在每一次迴圈時,要分情況討論,即判斷[l,mid-1]和[mid+1,r]哪個才是有序的,對於旋轉排序的陣列,必然有乙個是有序的。而結束的條件是nums[mid]=target,或者l>r還沒有產生target.

這題的小細節不少,主要是判斷條件的邊界,可以自己畫一畫,以免出錯。

一枚菜鳥的leetcode刷題筆記 Day8

70 爬樓梯 78 子集 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?class solution def uniquepaths self,m...

一枚菜鳥的leetcode刷題筆記 Day11

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?class solution def singlenumber self,nums list int int tmp for n...

一枚菜鳥的leetcode刷題筆記 Day14

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。class solution def findkthlargest self,nums list int k int int nums.sort 從小到大排列 return n...