Skip to content

Commit 62be0dd

Browse files
committed
feat: update leetcode and lcof solutions: No.0264. Ugly Number II
1 parent b72043a commit 62be0dd

File tree

11 files changed

+322
-85
lines changed

11 files changed

+322
-85
lines changed

lcof/面试题49. 丑数/README.md

+59-38
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,22 @@
1919
1. `1`  是丑数。
2020
2. `n`  不超过 1690。
2121

22+
[0264.Ugly Number II](/solution/0200-0299/0264.Ugly%20Number%20II/README.md)
23+
2224
## 解法
2325

2426
<!-- 这里可写通用的实现逻辑 -->
2527

28+
动态规划法。
29+
30+
定义数组 dp,`dp[i - 1]` 表示第 i 个丑数,那么第 n 个丑数就是 `dp[n - 1]`。最小的丑数是 1,所以 `dp[0] = 1`
31+
32+
定义 3 个指针 p2,p3,p5,表示下一个丑数是当前指针指向的丑数乘以对应的质因数。初始时,三个指针的值都指向 0。
33+
34+
`i∈[1,n)``dp[i] = min(dp[p2] * 2, dp[p3] * 3, dp[p5] * 5)`,然后分别比较 `dp[i]``dp[p2] * 2``dp[p3] * 3``dp[p5] * 5` 是否相等,若是,则对应的指针加 1。
35+
36+
最后返回 `dp[n - 1]` 即可。
37+
2638
<!-- tabs:start -->
2739

2840
### **Python3**
@@ -32,21 +44,18 @@
3244
```python
3345
class Solution:
3446
def nthUglyNumber(self, n: int) -> int:
35-
if n < 7:
36-
return n
37-
dp = [1 for _ in range(n)]
38-
i2 = i3 = i5 = 0
47+
dp = [1] * n
48+
p2 = p3 = p5 = 0
3949
for i in range(1, n):
40-
next2, next3, next5 = dp[i2] * 2, dp[i3] * 3, dp[i5] * 5
50+
next2, next3, next5 = dp[p2] * 2, dp[p3] * 3, dp[p5] * 5
4151
dp[i] = min(next2, next3, next5)
4252
if dp[i] == next2:
43-
i2 += 1
53+
p2 += 1
4454
if dp[i] == next3:
45-
i3 += 1
55+
p3 += 1
4656
if dp[i] == next5:
47-
i5 += 1
57+
p5 += 1
4858
return dp[n - 1]
49-
5059
```
5160

5261
### **Java**
@@ -56,31 +65,42 @@ class Solution:
5665
```java
5766
class Solution {
5867
public int nthUglyNumber(int n) {
59-
if (n < 7) {
60-
return n;
61-
}
6268
int[] dp = new int[n];
6369
dp[0] = 1;
64-
int i2 = 0, i3 = 0, i5= 0;
70+
int p2 = 0, p3 = 0, p5 = 0;
6571
for (int i = 1; i < n; ++i) {
66-
int next2 = dp[i2] * 2, next3 = dp[i3] * 3, next5 = dp[i5] * 5;
67-
dp[i] = Math.min(Math.min(next2, next3), next5);
68-
if (dp[i] == next2) {
69-
++i2;
70-
}
71-
if (dp[i] == next3) {
72-
++i3;
73-
}
74-
if (dp[i] == next5) {
75-
++i5;
76-
}
72+
int next2 = dp[p2] * 2, next3 = dp[p3] * 3, next5 = dp[p5] * 5;
73+
dp[i] = Math.min(next2, Math.min(next3, next5));
74+
if (dp[i] == next2) ++p2;
75+
if (dp[i] == next3) ++p3;
76+
if (dp[i] == next5) ++p5;
7777
}
7878
return dp[n - 1];
79-
8079
}
8180
}
8281
```
8382

83+
### **C++**
84+
85+
```cpp
86+
class Solution {
87+
public:
88+
int nthUglyNumber(int n) {
89+
vector<int> dp(n);
90+
dp[0] = 1;
91+
int p2 = 0, p3 = 0, p5 = 0;
92+
for (int i = 1; i < n; ++i) {
93+
int next2 = dp[p2] * 2, next3 = dp[p3] * 3, next5 = dp[p5] * 5;
94+
dp[i] = min(next2, min(next3, next5));
95+
if (dp[i] == next2) ++p2;
96+
if (dp[i] == next3) ++p3;
97+
if (dp[i] == next5) ++p5;
98+
}
99+
return dp[n - 1];
100+
}
101+
};
102+
```
103+
84104
### **JavaScript**
85105
86106
```js
@@ -89,20 +109,21 @@ class Solution {
89109
* @return {number}
90110
*/
91111
var nthUglyNumber = function (n) {
92-
let res = [1];
93-
//三指针
94-
let a = 0; //2
95-
let b = 0; //3
96-
let c = 0; //5
97-
let min = 0;
98-
for (let i = 1; i < n; i++) {
99-
min = Math.min(res[a] * 2, res[b] * 3, res[c] * 5);
100-
if (min === res[a] * 2) a++;
101-
if (min === res[b] * 3) b++;
102-
if (min === res[c] * 5) c++;
103-
res.push(min);
112+
let dp = [1];
113+
let p2 = 0,
114+
p3 = 0,
115+
p5 = 0;
116+
for (let i = 1; i < n; ++i) {
117+
const next2 = dp[p2] * 2,
118+
next3 = dp[p3] * 3,
119+
next5 = dp[p5] * 5;
120+
dp[i] = Math.min(next2, Math.min(next3, next5));
121+
if (dp[i] == next2) ++p2;
122+
if (dp[i] == next3) ++p3;
123+
if (dp[i] == next5) ++p5;
124+
dp.push(dp[i]);
104125
}
105-
return res[n - 1];
126+
return dp[n - 1];
106127
};
107128
```
108129

lcof/面试题49. 丑数/Solution.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution {
2+
public:
3+
int nthUglyNumber(int n) {
4+
vector<int> dp(n);
5+
dp[0] = 1;
6+
int p2 = 0, p3 = 0, p5 = 0;
7+
for (int i = 1; i < n; ++i) {
8+
int next2 = dp[p2] * 2, next3 = dp[p3] * 3, next5 = dp[p5] * 5;
9+
dp[i] = min(next2, min(next3, next5));
10+
if (dp[i] == next2) ++p2;
11+
if (dp[i] == next3) ++p3;
12+
if (dp[i] == next5) ++p5;
13+
}
14+
return dp[n - 1];
15+
}
16+
};
+6-16
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,15 @@
11
class Solution {
22
public int nthUglyNumber(int n) {
3-
if (n < 7) {
4-
return n;
5-
}
63
int[] dp = new int[n];
74
dp[0] = 1;
8-
int i2 = 0, i3 = 0, i5 = 0;
5+
int p2 = 0, p3 = 0, p5 = 0;
96
for (int i = 1; i < n; ++i) {
10-
int next2 = dp[i2] * 2, next3 = dp[i3] * 3, next5 = dp[i5] * 5;
11-
dp[i] = Math.min(Math.min(next2, next3), next5);
12-
if (dp[i] == next2) {
13-
++i2;
14-
}
15-
if (dp[i] == next3) {
16-
++i3;
17-
}
18-
if (dp[i] == next5) {
19-
++i5;
20-
}
7+
int next2 = dp[p2] * 2, next3 = dp[p3] * 3, next5 = dp[p5] * 5;
8+
dp[i] = Math.min(next2, Math.min(next3, next5));
9+
if (dp[i] == next2) ++p2;
10+
if (dp[i] == next3) ++p3;
11+
if (dp[i] == next5) ++p5;
2112
}
2213
return dp[n - 1];
23-
2414
}
2515
}

lcof/面试题49. 丑数/Solution.js

+14-13
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@
33
* @return {number}
44
*/
55
var nthUglyNumber = function (n) {
6-
let res = [1];
7-
//三指针
8-
let a = 0; //2
9-
let b = 0; //3
10-
let c = 0; //5
11-
let min = 0;
12-
for (let i = 1; i < n; i++) {
13-
min = Math.min(res[a] * 2, res[b] * 3, res[c] * 5);
14-
if (min === res[a] * 2) a++;
15-
if (min === res[b] * 3) b++;
16-
if (min === res[c] * 5) c++;
17-
res.push(min);
6+
let dp = [1];
7+
let p2 = 0,
8+
p3 = 0,
9+
p5 = 0;
10+
for (let i = 1; i < n; ++i) {
11+
const next2 = dp[p2] * 2,
12+
next3 = dp[p3] * 3,
13+
next5 = dp[p5] * 5;
14+
dp[i] = Math.min(next2, Math.min(next3, next5));
15+
if (dp[i] == next2) ++p2;
16+
if (dp[i] == next3) ++p3;
17+
if (dp[i] == next5) ++p5;
18+
dp.push(dp[i]);
1819
}
19-
return res[n - 1];
20+
return dp[n - 1];
2021
};

lcof/面试题49. 丑数/Solution.py

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
class Solution:
22
def nthUglyNumber(self, n: int) -> int:
3-
if n < 7:
4-
return n
5-
dp = [1 for _ in range(n)]
6-
i2 = i3 = i5 = 0
3+
dp = [1] * n
4+
p2 = p3 = p5 = 0
75
for i in range(1, n):
8-
next2, next3, next5 = dp[i2] * 2, dp[i3] * 3, dp[i5] * 5
6+
next2, next3, next5 = dp[p2] * 2, dp[p3] * 3, dp[p5] * 5
97
dp[i] = min(next2, next3, next5)
108
if dp[i] == next2:
11-
i2 += 1
9+
p2 += 1
1210
if dp[i] == next3:
13-
i3 += 1
11+
p3 += 1
1412
if dp[i] == next5:
15-
i5 += 1
13+
p5 += 1
1614
return dp[n - 1]

solution/0200-0299/0264.Ugly Number II/README.md

+87-1
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,112 @@
2222
<li><code>n</code>&nbsp;<strong>不超过</strong>1690。</li>
2323
</ol>
2424

25+
[面试题 49. 丑数](/lcof/面试题49.%20丑数/README.md)
26+
2527
## 解法
2628

2729
<!-- 这里可写通用的实现逻辑 -->
2830

31+
动态规划法。
32+
33+
定义数组 dp,`dp[i - 1]` 表示第 i 个丑数,那么第 n 个丑数就是 `dp[n - 1]`。最小的丑数是 1,所以 `dp[0] = 1`
34+
35+
定义 3 个指针 p2,p3,p5,表示下一个丑数是当前指针指向的丑数乘以对应的质因数。初始时,三个指针的值都指向 0。
36+
37+
`i∈[1,n)``dp[i] = min(dp[p2] * 2, dp[p3] * 3, dp[p5] * 5)`,然后分别比较 `dp[i]``dp[p2] * 2``dp[p3] * 3``dp[p5] * 5` 是否相等,若是,则对应的指针加 1。
38+
39+
最后返回 `dp[n - 1]` 即可。
40+
2941
<!-- tabs:start -->
3042

3143
### **Python3**
3244

3345
<!-- 这里可写当前语言的特殊实现逻辑 -->
3446

3547
```python
36-
48+
class Solution:
49+
def nthUglyNumber(self, n: int) -> int:
50+
dp = [1] * n
51+
p2 = p3 = p5 = 0
52+
for i in range(1, n):
53+
next2, next3, next5 = dp[p2] * 2, dp[p3] * 3, dp[p5] * 5
54+
dp[i] = min(next2, next3, next5)
55+
if dp[i] == next2:
56+
p2 += 1
57+
if dp[i] == next3:
58+
p3 += 1
59+
if dp[i] == next5:
60+
p5 += 1
61+
return dp[n - 1]
3762
```
3863

3964
### **Java**
4065

4166
<!-- 这里可写当前语言的特殊实现逻辑 -->
4267

4368
```java
69+
class Solution {
70+
public int nthUglyNumber(int n) {
71+
int[] dp = new int[n];
72+
dp[0] = 1;
73+
int p2 = 0, p3 = 0, p5 = 0;
74+
for (int i = 1; i < n; ++i) {
75+
int next2 = dp[p2] * 2, next3 = dp[p3] * 3, next5 = dp[p5] * 5;
76+
dp[i] = Math.min(next2, Math.min(next3, next5));
77+
if (dp[i] == next2) ++p2;
78+
if (dp[i] == next3) ++p3;
79+
if (dp[i] == next5) ++p5;
80+
}
81+
return dp[n - 1];
82+
}
83+
}
84+
```
85+
86+
### **C++**
87+
88+
```cpp
89+
class Solution {
90+
public:
91+
int nthUglyNumber(int n) {
92+
vector<int> dp(n);
93+
dp[0] = 1;
94+
int p2 = 0, p3 = 0, p5 = 0;
95+
for (int i = 1; i < n; ++i) {
96+
int next2 = dp[p2] * 2, next3 = dp[p3] * 3, next5 = dp[p5] * 5;
97+
dp[i] = min(next2, min(next3, next5));
98+
if (dp[i] == next2) ++p2;
99+
if (dp[i] == next3) ++p3;
100+
if (dp[i] == next5) ++p5;
101+
}
102+
return dp[n - 1];
103+
}
104+
};
105+
```
44106
107+
### **JavaScript**
108+
109+
```js
110+
/**
111+
* @param {number} n
112+
* @return {number}
113+
*/
114+
var nthUglyNumber = function (n) {
115+
let dp = [1];
116+
let p2 = 0,
117+
p3 = 0,
118+
p5 = 0;
119+
for (let i = 1; i < n; ++i) {
120+
const next2 = dp[p2] * 2,
121+
next3 = dp[p3] * 3,
122+
next5 = dp[p5] * 5;
123+
dp[i] = Math.min(next2, Math.min(next3, next5));
124+
if (dp[i] == next2) ++p2;
125+
if (dp[i] == next3) ++p3;
126+
if (dp[i] == next5) ++p5;
127+
dp.push(dp[i]);
128+
}
129+
return dp[n - 1];
130+
};
45131
```
46132

47133
### **...**

0 commit comments

Comments
 (0)