817 鍊錶元件

2022-01-23 02:59:29 字數 2299 閱讀 9581

求煉表中一段最長連續結點的值(值必須出現在列表g中,不要求順序)構成的集合的個數;

一開始還以為是要求順序的,想說用遞迴來做,發現鍊錶的值只是出現在列表中而已,因此判斷鍊錶中的值出現在列表中的次數(連續不算)即可,有點類似移動視窗的思路;

下面的實現是優化了幾次,第一次是使用了dict,第二次是不需要統計哪些值不存在(大部分的時間消耗在in函式中,其實這部分沒有必要進行判斷,只需要判斷出現的即可),第三版是最終的優化版本;

class

solution(object):

defnumcomponents(self, head, g):

"""執行用時 : 184 ms, 在linked list components的python提交中擊敗了31.75% 的使用者

記憶體消耗 : 18.8 mb, 在linked list components的python提交中擊敗了100.00% 的使用者

:type head: listnode

:type g: list[int]

:rtype: int

"""ans = 0

ifnot

head:

return

ansg = set(g)

g_dict =

while

head:

# 如果不在列表中則一直移動,直到找到出現在g中的結點

while

head

andnot

g_dict.get(head.val, 0):

head = head.next

ifhead

isnone:

return

ans# 如果存在的話,則一直移動,直到找到沒有出現在g中的結點

ifg_dict.get(head.val, 0):

ans += 1

while

head

andg_dict.get(head.val, 0):

head = head.next

return

ans​

defnumcomponents2(self, head, g):

"""執行用時 : 104 ms, 在linked list components的python提交中擊敗了55.56% 的使用者

記憶體消耗 : 18.7 mb, 在linked list components的python提交中擊敗了100.00% 的使用者

:type head: listnode

:type g: list[int]

:rtype: int

"""ans = 0

ifnot

head:

return

ansg = set(g)

g_dict =

while

head:

# 如果在列表中則一直移動,直到找到沒有出現在g中的結點

is_exist = false

while

head

andg_dict.get(head.val, 0):

is_exist = true

head = head.next

ifis_exist:

ans += 1

else:

head = head.next

return

ans​

defnumcomponents3(self, head, g):

"""執行用時 : 96 ms, 在linked list components的python提交中擊敗了98.41% 的使用者

記憶體消耗 : 18.8 mb, 在linked list components的python提交中擊敗了100.00% 的使用者

:type head: listnode

:type g: list[int]

:rtype: int

"""ans = 0

ifnot

head:

return

ansg = set(g)

while

head:

# 如果在列表中則一直移動,直到找到沒有出現在g中的結點

is_exist = false

while

head

andhead.val

ing:

is_exist = true

head = head.next

ifis_exist:

ans += 1

else:

head = head.next

return

ans

817 鍊錶元件

給定乙個鍊錶 鍊錶結點包含乙個整型值 的頭結點 head。同時給定列表 g,該列表是上述鍊錶中整型值的乙個子集。返回列表 g 中元件的個數,這裡對元件的定義為 鍊錶中一段最長連續結點的值 該值必須在列表 g 中 構成的集合。示例 1 輸入 head 0 1 2 3 g 0,1,3 輸出 2 解釋 鍊...

817 鍊錶元件

817.鍊錶元件 看懂題目是關鍵,因為缺失的結點值會將原鍊錶斷開,實際上就是讓我們求有多少個相連的子鍊錶。方法1 遍歷鍊錶,每個節點在g中找到則為1,否則為0,存入棧中stack 1,1,0,1,1 然後再對棧進行判斷 我們對鍊錶進行一次掃瞄,乙個元件在鍊錶中對應一段極長的連續節點,因此如果當前的節...

鍊錶 817 鍊錶元件

817.鍊錶元件 給定煉表頭結點 head,該鍊錶上的每個結點都有乙個 唯一的整型值 同時給定列表 g,該列表是上述鍊錶中整型值的乙個子集。返回列表 g 中元件的個數,這裡對元件的定義為 鍊錶中一段最長連續結點的值 該值必須在列表 g 中 構成的集合。示例 1 輸入 head 0 1 2 3 g 0...