Skip to content

Commit 6571219

Browse files
committed
feat: leetcode 面试题 17.09
1 parent d89a8fc commit 6571219

File tree

8 files changed

+103
-2
lines changed

8 files changed

+103
-2
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/-进度:506-green" alt="进度:506">
5+
<img src="https://img.shields.io/badge/-进度:507-green" alt="进度:507">
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
@@ -1632,6 +1632,12 @@
16321632
"title": "粉刷房子",
16331633
"path": "./problemset/paint-house/README.md",
16341634
"difficulty": "中等"
1635+
},
1636+
{
1637+
"id": "面试题 17.09",
1638+
"title": "第 k 个数",
1639+
"path": "./problemset/get-kth-magic-number-lcci/README.md",
1640+
"difficulty": "中等"
16351641
}
16361642
]
16371643
},

assets/data/topics.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5058,5 +5058,15 @@
50585058
"difficulty": "简单",
50595059
"url": "https://leetcode.cn/problems/check-permutation-lcci/",
50605060
"path": "./problemset/check-permutation-lcci/README.md"
5061+
},
5062+
{
5063+
"id": "面试题 17.09",
5064+
"title": {
5065+
"cn": "第 k 个数",
5066+
"en": "get-kth-magic-number-lcci"
5067+
},
5068+
"difficulty": "中等",
5069+
"url": "https://leetcode.cn/problems/get-kth-magic-number-lcci/",
5070+
"path": "./problemset/get-kth-magic-number-lcci/README.md"
50615071
}
50625072
]

assets/docs/CATEGORIES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@
305305
| 1994. [好子集的数目](../../problemset/the-number-of-good-subsets/README.md) | 困难 |
306306
| 2100. [适合打劫银行的日子](../../problemset/find-good-days-to-rob-the-bank/README.md) | 中等 |
307307
| 剑指 Offer II 091. [粉刷房子](../../problemset/paint-house/README.md) | 中等 |
308+
| 面试题 17.09. [第 k 个数](../../problemset/get-kth-magic-number-lcci/README.md) | 中等 |
308309

309310
## 双指针
310311

assets/docs/TOPICS.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1010,4 +1010,6 @@
10101010

10111011
[面试题 17.19. 消失的两个数字](../../problemset/missing-two-lcci/README.md)
10121012

1013-
[面试题 01.02. 判定是否互为字符重排](../../problemset/check-permutation-lcci/README.md)
1013+
[面试题 01.02. 判定是否互为字符重排](../../problemset/check-permutation-lcci/README.md)
1014+
1015+
[面试题 17.09. 第 k 个数](../../problemset/get-kth-magic-number-lcci/README.md)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# 第 k 个数
2+
3+
> 难度:中等
4+
>
5+
> https://leetcode.cn/problems/get-kth-magic-number-lcci/
6+
7+
## 题目
8+
9+
有些数的素因子只有 3,5,7,请设计一个算法找出第 `k` 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。
10+
11+
### 示例 1:
12+
13+
```
14+
输入: k = 5
15+
16+
输出: 9
17+
```
18+
19+
## 解题
20+
21+
```ts
22+
/**
23+
* 动态规划
24+
* @desc 时间复杂度 O(N) 空间复杂度 O(N)
25+
* @param k
26+
* @returns
27+
*/
28+
export function getKthMagicNumber(k: number): number {
29+
const dp = new Array(k + 1).fill(0)
30+
dp[1] = 1
31+
let p3 = 1
32+
let p5 = 1
33+
let p7 = 1
34+
for (let i = 2; i <= k; i++) {
35+
const num3 = dp[p3] * 3
36+
const num5 = dp[p5] * 5
37+
const num7 = dp[p7] * 7
38+
dp[i] = Math.min(Math.min(num3, num5), num7)
39+
if (dp[i] === num3) p3++
40+
if (dp[i] === num5) p5++
41+
if (dp[i] === num7) p7++
42+
}
43+
return dp[k]
44+
}
45+
```
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { getKthMagicNumber } from '.'
3+
4+
describe('第 k 个数', () => {
5+
testCase(getKthMagicNumber)
6+
})
7+
8+
function testCase(fn: (k: number) => number) {
9+
it.each([
10+
[5, 9],
11+
])('示例%#', (k, expected) => {
12+
expect(fn(k)).toBe(expected)
13+
})
14+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* 动态规划
3+
* @desc 时间复杂度 O(N) 空间复杂度 O(N)
4+
* @param k
5+
* @returns
6+
*/
7+
export function getKthMagicNumber(k: number): number {
8+
const dp = new Array(k + 1).fill(0)
9+
dp[1] = 1
10+
let p3 = 1
11+
let p5 = 1
12+
let p7 = 1
13+
for (let i = 2; i <= k; i++) {
14+
const num3 = dp[p3] * 3
15+
const num5 = dp[p5] * 5
16+
const num7 = dp[p7] * 7
17+
dp[i] = Math.min(Math.min(num3, num5), num7)
18+
if (dp[i] === num3) p3++
19+
if (dp[i] === num5) p5++
20+
if (dp[i] === num7) p7++
21+
}
22+
return dp[k]
23+
}

0 commit comments

Comments
 (0)