給定乙個鍊錶(鍊錶結點包含乙個整型值)的頭結點 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中的元素按照head裡的相對順序排好序,就可以用雙指標法解題,
用兩個指標分別指著head和g中的當前元素,逐步前進,
如果相等,而且是新的元件的開頭,則res + 1,
如果不相等,則標記一下已經斷開。
class solution(object):
def numcomponents(self, head, g):
""":type head: listnode
:type g: list[int]
:rtype: int
"""g =
g = set(g) #轉set提高處理速度
p = head
while p: #處理相對排序
if p.val in g:
p = p.next
p, i, res = head, 0, 0
seperate = true #用於標記當前是不是斷開
while i < len(g) and p:
if g[i] == p.val:
if seperate == true: #當前是斷開狀態
res += 1 #所以給res + 1
seperate = false #表示當前是連續
p = p.next
i += 1
else:
seperate = true #已經斷開
p = p.next
return res
第二種思路:
可以優化一下,不用那麼麻煩,直接把g轉成set,
然後把head裡每個節點都在g裡查詢一遍既可。
class solution(object):
def numcomponents(self, head, g):
""":type head: listnode
:type g: list[int]
:rtype: int
"""p = head
g = set(g) #轉成set,加快查詢速度到o(1)
res = 0
seperate = true
while p:
if p.val in g:
if seperate == true: #當前是乙個元件的開頭
res += 1
seperate = false
p = p.next
else:
seperate = true
p = p.next
return res
LeetCode Python 打家劫舍I
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
leetcode Python編碼練習
貪心演算法 1.環形路上有n個加油站,第i個加油站的汽油量是gas i 你有一輛車,車的油箱可以無限裝汽油。從加油站i走到下乙個加油站 i 1 花費的油量是cost i 你從乙個加油站出發,剛開始 的時候油箱裡面沒有汽油。求從哪個加油站出發可以在環形路上走一圈。返回加油站的下標,如果沒有答案的話返回...
leetcode Python實現 70 爬樓梯
描述 假設你正在爬樓梯。需要 n 步你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1.1 步 1 步 2.2 步 示例2 輸入 3 輸出 3 解釋 有三種方法可以爬到樓頂。...