leetcode 817. 链表组件
题目链接
https://leetcode.cn/problems/linked-list-components/
问题描述
测试数据
思路
这道题的题意是去一个nums中的元素能够将原链表切分成几段。首先分析一个独立成段的段首元素,一定满足出现在nums中,且它的前面一个元素没有在nums中出现,因此我们通过分析得出当前元素的依赖于上一个元素的状态,因此是对head进行遍历,在nums中进行查找。具体代码如下:
具体实现
class Solution:
def numComponents(self, head: Optional[ListNode], nums: List[int]) -> int:
numset = set(nums)
inflag = False
res = 0
while head:
if head.val not in numset:
#if head.val not in nums:
inflag = False
if head.val in numset and not flag:
inflag = True
res += 1
head = head.next
return res
总结
这道题我一开始是想用hash去做的,但是纠结于nums中元素的顺序,没有想到按顺序进行遍历。于是参考题解之后又在过了一段时间后二刷,不得不说,二刷确实是有收获的,当时我理解的为什么要在开头取一个set,是因为有一次周赛的题,数组里给了重复元素,按题面的意思是不可能出现的,这点就很坑,我当时以为的是去重,就没有再深究。当我二刷时,我早就忘了要取set了,但是也顺利的过了,但是出现了以下的结果:
没错,我比之前慢了30倍,wok,我以为是网速的问题,我疯狂的点击提交试图让我的代码的效率变高,但事实证明手速和效率有时候还不是成正比的hhhh,所以我开始找原因,同样的解法,为毛我第二次会比第一次慢这么多,经过我痛苦的排查,终于定位了问题 所在。我没想到,竟然是一个不起眼的set,让时间效率差了这么多。其实也不难想到,set的底层是hash,我们查找元素只需要O(1)的时间,而链表需要O(n),这也就导致了额外开一个set来存数据这种以空间换时间的方法在需要多次查找的时候还是一种很work的方法~