給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。
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...