Skip to content

Commit bbdb0be

Browse files
committed
feat: leetcode 313
1 parent b7beaf8 commit bbdb0be

File tree

8 files changed

+135
-2
lines changed

8 files changed

+135
-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/-进度:332-green" alt="进度:332">
5+
<img src="https://img.shields.io/badge/-进度:333-green" alt="进度:333">
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
@@ -1129,6 +1129,12 @@
11291129
"path": "./problemset/burst-balloons/README.md",
11301130
"difficulty": "困难"
11311131
},
1132+
{
1133+
"id": "313",
1134+
"title": "超级丑数",
1135+
"path": "./problemset/super-ugly-number/README.md",
1136+
"difficulty": "中等"
1137+
},
11321138
{
11331139
"id": "688",
11341140
"title": "骑士在棋盘上的概率",

assets/data/topics.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2479,6 +2479,16 @@
24792479
"url": "https://leetcode-cn.com/problems/burst-balloons/",
24802480
"path": "./problemset/burst-balloons/README.md"
24812481
},
2482+
{
2483+
"id": "313",
2484+
"title": {
2485+
"cn": "超级丑数",
2486+
"en": "super-ugly-number"
2487+
},
2488+
"difficulty": "中等",
2489+
"url": "https://leetcode-cn.com/problems/super-ugly-number/",
2490+
"path": "./problemset/super-ugly-number/README.md"
2491+
},
24822492
{
24832493
"id": "342",
24842494
"title": {
@@ -3319,4 +3329,4 @@
33193329
"url": "https://leetcode-cn.com/problems/sum-of-subarray-ranges/",
33203330
"path": "./problemset/sum-of-subarray-ranges/README.md"
33213331
}
3322-
]
3332+
]

assets/docs/CATEGORIES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@
221221
| 300. [最长递增子序列](../../problemset/longest-increasing-subsequence/README.md) | 中等 |
222222
| 309. [最佳买卖股票时机含冷冻期](../../problemset/best-time-to-buy-and-sell-stock-with-cooldown/README.md) | 中等 |
223223
| 312. [戳气球](../../problemset/burst-balloons/README.md) | 困难 |
224+
| 313. [超级丑数](../../problemset/super-ugly-number/README.md) | 中等 |
224225
| 688. [骑士在棋盘上的概率](../../problemset/knight-probability-in-chessboard/README.md) | 中等 |
225226
| 1994. [好子集的数目](../../problemset/the-number-of-good-subsets/README.md) | 困难 |
226227
| 2100. [适合打劫银行的日子](../../problemset/find-good-days-to-rob-the-bank/README.md) | 中等 |

assets/docs/TOPICS.md

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

497497
[312. 戳气球](../../problemset/burst-balloons/README.md)
498498

499+
[313. 超级丑数](../../problemset/super-ugly-number/README.md)
500+
499501
[342. 4的幂](../../problemset/power-of-four/README.md)
500502

501503
[355. 设计推特](../../problemset/design-twitter/README.md)
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# 超级丑数
2+
3+
> 难度:中等
4+
>
5+
> https://leetcode-cn.com/problems/super-ugly-number/
6+
7+
## 题目
8+
9+
**超级丑数** 是一个正整数,并满足其所有质因数都出现在质数数组 `primes` 中。
10+
11+
给你一个整数 `n` 和一个整数数组 `primes` ,返回第 `n`**超级丑数**
12+
13+
题目数据保证第 `n`**超级丑数**`32-bit` 带符号整数范围内。
14+
15+
### 示例
16+
17+
#### 示例 1:
18+
19+
```
20+
输入:n = 12, primes = [2,7,13,19]
21+
输出:32
22+
解释:给定长度为 4 的质数数组 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。
23+
```
24+
25+
#### 示例 2:
26+
27+
```
28+
输入:n = 1, primes = [2,3,5]
29+
输出:1
30+
解释:1 不含质因数,因此它的所有质因数都在质数数组 primes = [2,3,5] 中。
31+
```
32+
33+
34+
### 提示:
35+
36+
- `1 <= n <= 106`
37+
- `1 <= primes.length <= 100`
38+
- `2 <= primes[i] <= 1000`
39+
- 题目数据 **保证** `primes[i]` 是一个质数
40+
- `primes` 中的所有值都 **互不相同** ,且按 **递增顺序** 排列
41+
42+
## 解题
43+
44+
```ts
45+
/**
46+
* 动态规划
47+
* @desc 时间复杂度 O(MN) 空间复杂度 O(N+M)
48+
* @param n
49+
* @param primes
50+
* @returns
51+
*/
52+
export function nthSuperUglyNumber(n: number, primes: number[]): number {
53+
const dp = new Array(n + 1).fill(0)
54+
const len = primes.length
55+
const pointers = new Array(len).fill(0)
56+
const nums = new Array(len).fill(1)
57+
for (let i = 1; i <= n; i++) {
58+
let minNum = Number.MAX_SAFE_INTEGER
59+
for (let j = 0; j < len; j++)
60+
minNum = Math.min(minNum, nums[j])
61+
62+
dp[i] = minNum
63+
for (let j = 0; j < len; j++) {
64+
if (nums[j] === minNum) {
65+
pointers[j]++
66+
nums[j] = dp[pointers[j]] * primes[j]
67+
}
68+
}
69+
}
70+
return dp[n]
71+
}
72+
```
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { nthSuperUglyNumber } from '.'
3+
4+
describe('超级丑数', () => {
5+
testCase(nthSuperUglyNumber)
6+
})
7+
8+
function testCase(fn: (n: number, primes: number[]) => number) {
9+
it.each([
10+
[12, [2, 7, 13, 19], 32],
11+
[1, [2, 3, 5], 1],
12+
])('示例%#', (n, primes, expected) => {
13+
expect(fn(n, primes)).toBe(expected)
14+
})
15+
}

problemset/super-ugly-number/index.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* 动态规划
3+
* @desc 时间复杂度 O(MN) 空间复杂度 O(N+M)
4+
* @param n
5+
* @param primes
6+
* @returns
7+
*/
8+
export function nthSuperUglyNumber(n: number, primes: number[]): number {
9+
const dp = new Array(n + 1).fill(0)
10+
const len = primes.length
11+
const pointers = new Array(len).fill(0)
12+
const nums = new Array(len).fill(1)
13+
for (let i = 1; i <= n; i++) {
14+
let minNum = Number.MAX_SAFE_INTEGER
15+
for (let j = 0; j < len; j++)
16+
minNum = Math.min(minNum, nums[j])
17+
18+
dp[i] = minNum
19+
for (let j = 0; j < len; j++) {
20+
if (nums[j] === minNum) {
21+
pointers[j]++
22+
nums[j] = dp[pointers[j]] * primes[j]
23+
}
24+
}
25+
}
26+
return dp[n]
27+
}

0 commit comments

Comments
 (0)