leetcode 817. 链表组件

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的方法~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值