Skip to content

Commit 87a9be9

Browse files
committed
feat: leetcode 532
1 parent bbd7595 commit 87a9be9

File tree

8 files changed

+140
-1
lines changed

8 files changed

+140
-1
lines changed

README.md

+1-1
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/-进度:403-green" alt="进度:403">
5+
<img src="https://img.shields.io/badge/-进度:404-green" alt="进度:404">
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

+6
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,12 @@
188188
"path": "./problemset/all-one-data-structure/README.md",
189189
"difficulty": "困难"
190190
},
191+
{
192+
"id": "532",
193+
"title": "数组中的 k-diff 数对",
194+
"path": "./problemset/k-diff-pairs-in-an-array/README.md",
195+
"difficulty": "中等"
196+
},
191197
{
192198
"id": "599",
193199
"title": "两个列表的最小索引总和",

assets/data/topics.json

+10
Original file line numberDiff line numberDiff line change
@@ -2989,6 +2989,16 @@
29892989
"url": "https://leetcode-cn.com/problems/longest-uncommon-subsequence-i/",
29902990
"path": "./problemset/longest-uncommon-subsequence/README.md"
29912991
},
2992+
{
2993+
"id": "532",
2994+
"title": {
2995+
"cn": "数组中的 k-diff 数对",
2996+
"en": "k-diff-pairs-in-an-array"
2997+
},
2998+
"difficulty": "中等",
2999+
"url": "https://leetcode.cn/problems/k-diff-pairs-in-an-array/",
3000+
"path": "./problemset/k-diff-pairs-in-an-array/README.md"
3001+
},
29923002
{
29933003
"id": "537",
29943004
"title": {

assets/docs/CATEGORIES.md

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
| 380. [O(1) 时间插入、删除和获取随机元素](../../problemset/insert-delete-getrandom-o1/README.md) | 中等 |
3636
| 398. [随机数索引](../../problemset/random-pick-index/README.md) | 中等 |
3737
| 432. [全 O(1) 的数据结构](../../problemset/all-one-data-structure/README.md) | 困难 |
38+
| 532. [数组中的 k-diff 数对](../../problemset/k-diff-pairs-in-an-array/README.md) | 中等 |
3839
| 599. [两个列表的最小索引总和](../../problemset/minimum-index-sum-of-two-lists/README.md) | 简单 |
3940
| 653. [两数之和 IV - 输入 BST](../../problemset/two-sum-iv-input-is-a-bst/README.md) | 简单 |
4041
| 720. [词典中最长的单词](../../problemset/longest-word-in-dictionary/README.md) | 简单 |

assets/docs/TOPICS.md

+2
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,8 @@
598598

599599
[521. 最长特殊序列](../../problemset/longest-uncommon-subsequence/README.md)
600600

601+
[532. 数组中的 k-diff 数对](../../problemset/k-diff-pairs-in-an-array/README.md)
602+
601603
[537. 复数乘法](../../problemset/complex-number-multiplication/README.md)
602604

603605
[540. 有序数组中的单一元素](../../problemset/single-element-in-a-sorted-array/README.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# 数组中的 k-diff 数对
2+
3+
> 难度:中等
4+
>
5+
> https://leetcode.cn/problems/k-diff-pairs-in-an-array/
6+
7+
## 题目
8+
9+
给定一个整数数组和一个整数 `k`,你需要在数组里找到 **不同的** `k-diff` 数对,并返回不同的 **`k-diff` 数对** 的数目。
10+
11+
这里将 `k-diff` 数对定义为一个整数对 `(nums[i], nums[j])`,并满足下述全部条件:
12+
13+
- `0 <= i < j < nums.length`
14+
-` |nums[i] - nums[j]| == k`
15+
16+
注意,`|val|` 表示` val` 的绝对值。
17+
18+
### 示例
19+
20+
#### 示例 1:
21+
22+
```
23+
输入:nums = [3, 1, 4, 1, 5], k = 2
24+
输出:2
25+
解释:数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
26+
尽管数组中有两个1,但我们只应返回不同的数对的数量。
27+
```
28+
29+
#### 示例 2:
30+
31+
```
32+
输入:nums = [1, 2, 3, 4, 5], k = 1
33+
输出:4
34+
解释:数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5)。
35+
```
36+
37+
#### 示例 3:
38+
39+
```
40+
输入:nums = [1, 3, 1, 5, 4], k = 0
41+
输出:1
42+
解释:数组中只有一个 0-diff 数对,(1, 1)。
43+
```
44+
45+
## 解题
46+
47+
```ts
48+
/**
49+
* 哈希表
50+
* @desc 时间复杂度 O(N) 空间复杂度 O(N)
51+
* @param nums
52+
* @param k
53+
* @returns
54+
*/
55+
export function findPairs(nums: number[], k: number): number {
56+
const res = new Set<number>()
57+
const visited = new Set<number>()
58+
59+
for (const num of nums) {
60+
if (visited.has(num - k))
61+
res.add(num - k)
62+
if (visited.has(num + k))
63+
res.add(num)
64+
65+
visited.add(num)
66+
}
67+
68+
return res.size
69+
}
70+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { findPairs } from '.'
3+
4+
describe('数组中的 k-diff 数对', () => {
5+
testCase(findPairs)
6+
})
7+
8+
function testCase(fn: (nums: number[], k: number) => number) {
9+
it.each([
10+
[
11+
[3, 1, 4, 1, 5],
12+
2,
13+
2,
14+
],
15+
[
16+
[1, 2, 3, 4, 5],
17+
1,
18+
4,
19+
],
20+
[
21+
[1, 3, 1, 5, 4],
22+
0,
23+
1,
24+
],
25+
])('示例%#', (nums, k, expected) => {
26+
expect(fn(nums, k)).toBe(expected)
27+
})
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* 哈希表
3+
* @desc 时间复杂度 O(N) 空间复杂度 O(N)
4+
* @param nums
5+
* @param k
6+
* @returns
7+
*/
8+
export function findPairs(nums: number[], k: number): number {
9+
const res = new Set<number>()
10+
const visited = new Set<number>()
11+
12+
for (const num of nums) {
13+
if (visited.has(num - k))
14+
res.add(num - k)
15+
if (visited.has(num + k))
16+
res.add(num)
17+
18+
visited.add(num)
19+
}
20+
21+
return res.size
22+
}

0 commit comments

Comments
 (0)