Leetcode 817 鍊錶元件

2021-09-26 19:59:37 字數 1487 閱讀 6288

time: 20190903

type: medium

給定乙個鍊錶(鍊錶結點包含乙個整型值)的頭結點 head。

同時給定列表 g,該列表是上述鍊錶中整型值的乙個子集。

返回列表 g 中元件的個數,這裡對元件的定義為:鍊錶中一段最長連續結點的值(該值必須在列表 g 中)構成的集合。

示例 1:

輸入:head: 0->1->2->3

g = [0, 1, 3]

輸出: 2

解釋:鍊錶中,0 和 1 是相連線的,且 g 中不包含 2,所以 [0, 1] 是 g 的乙個元件,同理 [3] 也是乙個元件,故返回 2。

示例 2:

輸入:head: 0->1->2->3->4

g = [0, 3, 1, 4]

輸出: 2

解釋:鍊錶中,0 和 1 是相連線的,3 和 4 是相連線的,所以 [0, 1] 和 [3, 4] 是兩個元件,故返回 2。

注意:如果 n 是給定鍊錶 head 的長度,1 <= n <= 10000。

鍊錶中每個結點的值所在範圍為 [0, n - 1]。

1 <= g.length <= 10000

g 是鍊錶中所有結點的值的乙個子集.

遍歷鍊錶時去查詢數字是否出現在g中,如果連續出現,則指標也後移,計數不加。

問題是,如果直接問元素是否在g中,結果會超時,換用集合來比較就可以了。

集合增刪查改的平均複雜度是o(1),底層實現方式是帶有空值的字典。

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

numcomponents

(self, head: listnode, g: list[

int])-

>

int:

ifnot head:

return

0 _set =

set(

)for num in g:

_set.add(num)

count =

0while head:

val = head.val

if val in _set:

count +=

1while val in _set and head.

next

: head = head.

next

val = head.val

head = head.

next

return count

set的in比list的in要快很多。

end.

LeetCode 817 鍊錶元件

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

leetcode 817 鍊錶元件

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

LeetCode 817 鍊錶元件 計數

解法一 常規解法,建圖 dfs,時間複雜度o n o n 空間複雜度因為需要儲存圖,所以是o n 這種方法是通解,對於所有圖都適用。definition for singly linked list.struct listnode class solution u v dfs int ans 0 u...