持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
大家好 我是丝瓜咸蛋汤。今天带来的是一道在LeetCode上的题目,题目难度为中等
。就在此为大家分享一下解答思路。
题目阐述
给定链表头结点 head,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums,该列表是上述链表中整型值的一个子集。
返回列表 nums 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 nums 中)构成的集合。
思路阐述
其实这道题目 读懂题目比完成代码花的时间还长。。。。
题目的意思是计算val在nums里面的组件的个数
也就是说,不是再求最长子组件的长度
所以操作起来真的很简单,用一个set转存就完事了,读题理解时间比操作时间还长。。。
代码实现
function numComponents(head: ListNode | null, nums: number[]): number {
let set = new Set<number>()
for (const i of nums) set.add(i)
let res = 0
// let cur = 0
while (head != null) {
if (set.has(head.val)) {
while (head != null && set.has(head.val)) {
head = head.next
}
res++
// res = Math.max(cur, res)
}
else {
head = head.next
}
}
return res
};
运行结果
执行用时:80 ms, 在所有 TypeScript 提交中击败了53.33%的用户
内存消耗:46.9 MB, 在所有 TypeScript 提交中击败了93.33%的用户
通过测试用例:57 / 57
其他解法
这里是来自评论区的一道来自java的解法:
public int numComponents(ListNode head, int[] nums) {
//题目限制链长不超过10000,题目限制每个head.val值唯一
boolean[] flag=new boolean[10001];
//判断哪个值有
for(int num:nums)flag[num]=true;
//pre记录前一个值存不存在,result记录链长
int res=0;boolean pre=false;
while(head!=null){
//如果前一个值不存在而当前遍历到的节点的值存在,则res+1
if(!pre&&flag[head.val])res++;
//记录当前遍历到的节点的值存在与否
pre=flag[head.val];
//继续遍历
head=head.next;
}
return res;
}
这个思路比较直接 通过一个布尔类的判断数组去判断前后节点的状况,从而打到一次遍历解决问题。
我是丝瓜咸蛋汤
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!