leetcode 817. 链表组件
题目:817. 链表组件
给定链表头结点 head,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums,该列表是上述链表中整型值的一个子集。
返回列表 nums 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 nums 中)构成的集合。
示例1:
输入: head = [0,1,2,3], nums = [0,1,3]
输出: 2
解释: 链表中,0 和 1 是相连接的,且 nums 中不包含 2,所以 [0, 1] 是 nums 的一个组件,同理 [3] 也是一个组件,故返回 2。
示例2:
输入: head = [0,1,2,3,4], nums = [0,3,1,4]
输出: 2
解释: 链表中,0 和 1 是相连接的,3 和 4 是相连接的,所以 [0, 1] 和 [3, 4] 是两个组件,故返回 2。
提示:
- 链表中节点数为n
- 1 <= n <= 10^4
- 0 <= Node.val < n
- Node.val 中所有值 不同
- 1 <= nums.length <= n
- 0 <= nums[i] < n
- nums 中所有值 不同
方法一:模拟
思路:遍历链表,由于一个组件在链表中对应一段极长的连续节点,因此如果当前的节点在数组nums中,且下一个节点不在数组nums中,则组件数加1。通过Arrays工具类的sort方法对nums数组排序,方便使用Arrays类的binarySearch方法查找遍历的节点在不在数组nums中,从而提高查找效率。
运行数据:执行用时:8 ms,内存消耗:42.2 MB
复杂度分析:
- 时间复杂度:O(mlogn), m表示链表head的节点数,n表示nums数组长度。
- 空间复杂度:O(1)。
1 | /** |
方法二:hash
思路:由于1 <= n <= 10^4、0 <= nums[i] < n、nums 中所有值 不同,所以可以创建一个boolean组数作为哈希表,以nums元素的值作为哈希值将nums组数转存到哈希表中,从而将方法一中查找链表节点的时间复杂度从O(logn)提高到O(1)。以增加10^4次方的额外空间换取查找节点时间效率的提升,由于10^4是常数,空间复杂度仍为O(1)。
运行数据:执行用时:1 ms,内存消耗:41.3 MB
复杂度分析:
- 时间复杂度:O(m), m表示链表head的节点数。
- 空间复杂度:O(1)。
1 | /** |
学习所得,资料、图片部分来源于网络,如有侵权,请联系本人删除。
才疏学浅,若有错误或不当之处,可批评指正,还请见谅!