这题思路挺简单,但是我Error了太多次!!首先我想就是记录每个数字的后面一个数字,然后类似于跳着查找这样的方式,将走过的数字的标志变为1,直到结束,后来超时了。突然发现与顺序无关,那么如果在G中标志为1,不在G中标志为0,不就变成找一个列表当中有多少个1的团吗。后来结果又超时了,我还以为是用了两个独立的循环导致的,最后把他们写在一起,结果还是超时。我TM就纳闷了,为啥我复杂度都是O(n)你这个还是超时!!!!结果突然发现not in 和 in 这两个操作!!哇,难受!后来我就典型地牺牲空间换时间地方式,通过弄一个大的list来判断是不是在了。附代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def numComponents(self, head, G):
"""
:type head: ListNode
:type G: List[int]
:rtype: int
"""
GG = []
pos = []
h = []
while head!= None:
h.append(head.val)
head = head.next
head = h
visited = [0] * len(head)
for i in range(len(head)):
val = head[i]
if val in G:
GG.append(val)
if i == len(head) - 1:
pos.append(-1)
else:
pos.append(head[i+1])
count = 0
for i in range(len(GG)):
if visited[GG[i]] == 1:
continue
val = GG[i]
visited[val] = 1
count += 1
j = i
while visited[pos[j]] == 0 and pos[j] in GG:
visited[pos[j]] = 1
j = GG.index(pos[j])
return count