持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
题目
给定链表头结点 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^40 <= Node.val < nNode.val中所有值 不同1 <= nums.length <= n0 <= nums[i] < nnums中所有值 不同
思考
本题难度中等。
首先是读懂题意。给定链表头结点 head 和列表 nums,该列表是上述链表中整型值的一个子集。我们需要返回列表 nums 中组件的个数。
我们可以定义哈希表set,存储nums中的元素。定义变量inSet表示当前节点的前一个节点是否在数组nums中,默认是false。定义ans表示 nums 中组件的个数。
遍历链表head,如果当前节点的值在set中,且inSet是false,则ans++。最后返回ans即可。需要注意的是:
-
链表head中每个节点的值都是唯一的整数。
-
列表nums中的组件指的是该组件中的值在head中是连续的节点,比如链表[0,1,2,3], nums = [0,1,3]中包含了[0,1]和[3]这两个组件。
解答
方法一:模拟
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number[]} nums
* @return {number}
*/
var numComponents = function(head, nums) {
let ans = 0
let set = new Set(nums)
let inSet = false
while (head) {
if (!set.has(head.val)) {
inSet = false
} else {
if (!inSet) {
inSet = true
ans++
}
}
head = head.next
}
return ans
}
// 执行用时:64 ms, 在所有 JavaScript 提交中击败了97.73%的用户
// 内存消耗:46.4 MB, 在所有 JavaScript 提交中击败了34.09%的用户
// 通过测试用例:57 / 57
复杂度分析:
- 时间复杂度:O(n),其中 n 是链表 head 的长度,需要遍历一遍链表。
- 空间复杂度:O(m),其中 m 是数组 nums 的长度,需要一个哈希集合来存储 nums 的元素。