Skip to content

Commit f38393e

Browse files
committed
feat: leetcode 817
1 parent 2453de9 commit f38393e

File tree

8 files changed

+143
-1
lines changed

8 files changed

+143
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<p align="center">
44
<!-- TOPICS COUNT START -->
5-
<img src="https://img.shields.io/badge/-进度:517-green" alt="进度:517">
5+
<img src="https://img.shields.io/badge/-进度:518-green" alt="进度:518">
66
<!-- TOPICS COUNT END -->
77
<a href="./assets/docs/TOPICS.md"><img src="https://img.shields.io/badge/-题库目录-blue" alt="题库目录"></a>
88
<a href="./assets/docs/CATEGORIES.md"><img src="https://img.shields.io/badge/-题库分类-red" alt="题库分类"></a>

assets/data/categories.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2333,6 +2333,12 @@
23332333
"path": "./problemset/number-of-lines-to-write-string/README.md",
23342334
"difficulty": "简单"
23352335
},
2336+
{
2337+
"id": "817",
2338+
"title": "链表组件",
2339+
"path": "./problemset/linked-list-components/README.md",
2340+
"difficulty": "中等"
2341+
},
23362342
{
23372343
"id": "821",
23382344
"title": "字符的最短距离",

assets/data/topics.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3859,6 +3859,16 @@
38593859
"url": "https://leetcode.cn/problems/binary-tree-pruning/",
38603860
"path": "./problemset/binary-tree-pruning/README.md"
38613861
},
3862+
{
3863+
"id": "817",
3864+
"title": {
3865+
"cn": "链表组件",
3866+
"en": "linked-list-components"
3867+
},
3868+
"difficulty": "中等",
3869+
"url": "https://leetcode.cn/problems/linked-list-components/",
3870+
"path": "./problemset/linked-list-components/README.md"
3871+
},
38623872
{
38633873
"id": "819",
38643874
"title": {

assets/docs/CATEGORIES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@
430430
| 796. [旋转字符串](../../problemset/rotate-string/README.md) | 简单 |
431431
| 798. [得分最高的最小轮调](../../problemset/smallest-rotation-with-highest-score/README.md) | 困难 |
432432
| 806. [写字符串需要的行数](../../problemset/number-of-lines-to-write-string/README.md) | 简单 |
433+
| 817. [链表组件](../../problemset/linked-list-components/README.md) | 中等 |
433434
| 821. [字符的最短距离](../../problemset/shortest-distance-to-a-character/README.md) | 简单 |
434435
| 824. [山羊拉丁文](../../problemset/goat-latin/README.md) | 简单 |
435436
| 827. [最大人工岛](../../problemset/making-a-large-island/README.md) | 困难 |

assets/docs/TOPICS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,8 @@
772772

773773
[814. 二叉树剪枝](../../problemset/binary-tree-pruning/README.md)
774774

775+
[817. 链表组件](../../problemset/linked-list-components/README.md)
776+
775777
[819. 最常见的单词](../../problemset/most-common-word/README.md)
776778

777779
[821. 字符的最短距离](../../problemset/shortest-distance-to-a-character/README.md)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# 链表组件
2+
3+
> 难度:中等
4+
>
5+
> https://leetcode.cn/problems/linked-list-components/
6+
7+
## 题目
8+
9+
给定链表头结点 head,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums,该列表是上述链表中整型值的一个子集。
10+
11+
返回列表 nums 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 nums 中)构成的集合。
12+
13+
 
14+
15+
#### 示例 1:
16+
17+
![image](https://user-images.githubusercontent.com/54696834/195327308-9cd30480-b7c0-4c5d-bc13-24cfd0b8a93f.png)
18+
19+
```
20+
输入: head = [0,1,2,3], nums = [0,1,3]
21+
输出: 2
22+
解释: 链表中,0 和 1 是相连接的,且 nums 中不包含 2,所以 [0, 1] 是 nums 的一个组件,同理 [3] 也是一个组件,故返回 2。
23+
```
24+
25+
#### 示例 2:
26+
27+
![image](https://user-images.githubusercontent.com/54696834/195327359-32946af2-6e12-4133-8b80-fab2a9b0d3d3.png)
28+
29+
30+
输入: head = [0,1,2,3,4], nums = [0,3,1,4]
31+
输出: 2
32+
解释: 链表中,0 和 1 是相连接的,3 和 4 是相连接的,所以 [0, 1][3, 4] 是两个组件,故返回 2。
33+
34+
35+
## 解题
36+
37+
```ts
38+
import type { ListNode } from '~/utils/listNode'
39+
40+
/**
41+
* 计算组件的起始位置
42+
* @desc 时间复杂度 O(N) 空间复杂度 O(M)
43+
* @param head
44+
* @param nums
45+
* @returns
46+
*/
47+
export function numComponents(head: ListNode | null, nums: number[]): number {
48+
const numsSet = new Set<number>()
49+
for (const num of nums)
50+
numsSet.add(num)
51+
52+
let inSet = false
53+
let res = 0
54+
while (head) {
55+
if (numsSet.has(head.val)) {
56+
if (!inSet) {
57+
inSet = true
58+
res++
59+
}
60+
}
61+
else {
62+
inSet = false
63+
}
64+
head = head.next
65+
}
66+
return res
67+
}
68+
```
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { numComponents } from '.'
3+
import type { ListNode } from '~/utils/listNode'
4+
import { createListNode } from '~/utils/listNode'
5+
6+
describe('链表组件', () => {
7+
testCase(numComponents)
8+
})
9+
10+
function testCase(fn: (head: ListNode | null, nums: number[]) => number) {
11+
it.each([
12+
[
13+
[0, 1, 2, 3],
14+
[0, 1, 3],
15+
2,
16+
],
17+
[
18+
[0, 1, 2, 3, 4],
19+
[0, 3, 1, 4],
20+
2,
21+
],
22+
])('示例%#', (head, nums, expected) => {
23+
expect(fn(createListNode(head), nums)).toBe(expected)
24+
})
25+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import type { ListNode } from '~/utils/listNode'
2+
3+
/**
4+
* 计算组件的起始位置
5+
* @desc 时间复杂度 O(N) 空间复杂度 O(M)
6+
* @param head
7+
* @param nums
8+
* @returns
9+
*/
10+
export function numComponents(head: ListNode | null, nums: number[]): number {
11+
const numsSet = new Set<number>()
12+
for (const num of nums)
13+
numsSet.add(num)
14+
15+
let inSet = false
16+
let res = 0
17+
while (head) {
18+
if (numsSet.has(head.val)) {
19+
if (!inSet) {
20+
inSet = true
21+
res++
22+
}
23+
}
24+
else {
25+
inSet = false
26+
}
27+
head = head.next
28+
}
29+
return res
30+
}

0 commit comments

Comments
 (0)