【LeetCode】链表组件 Java 题解
题目描述
给定链表头结点 head,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums,该列表是上述链表中整型值的一个子集。
返回列表 nums 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 nums 中)构成的集合。
思路分析
今天的算法题目是链表结合数组的题目。题目要求计算列表 nums 中组件的个数。这里的组件定义为链表中一段最长连续结点的值(该值必须在列表 nums 中)构成的集合。理解起来还是比较抽象,不容易懂。我们在结合 case 1 理解分析,head = [0,1,2,3], nums = [0,1,3]。组件是 [0, 1], [3]。也许你会问,为什么[0],[1] 不是组件呢?原因是组件是链表中一段最长连续结点的值,由于在链表中,0,1 连续,所以[0,1] 才是组件,而[0],[1]不是。
结合 case 理解题目之后,我们需要对链表进行逐个遍历,判断某个值是不是在 nums 中,我们可以把 nums 数组转换为 set, 提升判断的查询效率。然后需要判断是否最长。这里有一个巧妙的办法,就是定义一个 inSet 布尔值变量,当包含的时候,修改 inSet 为 true, 不包含修改为 false。只有第一次,也就是节点的值在数组 nums 中且节点的前一个点不在数组 nums 中,inSet 为 false 的时候,统计为 1 个答案。
具体实现代码如下,供参考。
通过代码
总结
上述代码的时间复杂度是 O(n), 空间复杂度是 O(n)
坚持算法每日一题,加油!欢迎算法爱好者一起交流学习。
版权声明: 本文为 InfoQ 作者【Albert】的原创文章。
原文链接:【http://xie.infoq.cn/article/255b6fc06ac96f563ee703666】。文章转载请联系作者。
评论