Skip to content

Commit 93c4100

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

File tree

11 files changed

+318
-85
lines changed

11 files changed

+318
-85
lines changed

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

Lines changed: 57 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@
2323

2424
<!-- 这里可写通用的实现逻辑 -->
2525

26+
动态规划法。
27+
28+
定义数组 dp,`dp[i - 1]` 表示第 i 个丑数,那么第 n 个丑数就是 `dp[n - 1]`。最小的丑数是 1,所以 `dp[0] = 1`
29+
30+
定义 3 个指针 p2,p3,p5,表示下一个丑数是当前指针指向的丑数乘以对应的质因数。初始时,三个指针的值都指向 0。
31+
32+
`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。
33+
34+
最后返回 `dp[n - 1]` 即可。
35+
2636
<!-- tabs:start -->
2737

2838
### **Python3**
@@ -32,21 +42,18 @@
3242
```python
3343
class Solution:
3444
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
45+
dp = [1] * n
46+
p2 = p3 = p5 = 0
3947
for i in range(1, n):
40-
next2, next3, next5 = dp[i2] * 2, dp[i3] * 3, dp[i5] * 5
48+
next2, next3, next5 = dp[p2] * 2, dp[p3] * 3, dp[p5] * 5
4149
dp[i] = min(next2, next3, next5)
4250
if dp[i] == next2:
43-
i2 += 1
51+
p2 += 1
4452
if dp[i] == next3:
45-
i3 += 1
53+
p3 += 1
4654
if dp[i] == next5:
47-
i5 += 1
55+
p5 += 1
4856
return dp[n - 1]
49-
5057
```
5158

5259
### **Java**
@@ -56,31 +63,42 @@ class Solution:
5663
```java
5764
class Solution {
5865
public int nthUglyNumber(int n) {
59-
if (n < 7) {
60-
return n;
61-
}
6266
int[] dp = new int[n];
6367
dp[0] = 1;
64-
int i2 = 0, i3 = 0, i5= 0;
68+
int p2 = 0, p3 = 0, p5 = 0;
6569
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-
}
70+
int next2 = dp[p2] * 2, next3 = dp[p3] * 3, next5 = dp[p5] * 5;
71+
dp[i] = Math.min(next2, Math.min(next3, next5));
72+
if (dp[i] == next2) ++p2;
73+
if (dp[i] == next3) ++p3;
74+
if (dp[i] == next5) ++p5;
7775
}
7876
return dp[n - 1];
79-
8077
}
8178
}
8279
```
8380

81+
### **C++**
82+
83+
```cpp
84+
class Solution {
85+
public:
86+
int nthUglyNumber(int n) {
87+
vector<int> dp(n);
88+
dp[0] = 1;
89+
int p2 = 0, p3 = 0, p5 = 0;
90+
for (int i = 1; i < n; ++i) {
91+
int next2 = dp[p2] * 2, next3 = dp[p3] * 3, next5 = dp[p5] * 5;
92+
dp[i] = min(next2, min(next3, next5));
93+
if (dp[i] == next2) ++p2;
94+
if (dp[i] == next3) ++p3;
95+
if (dp[i] == next5) ++p5;
96+
}
97+
return dp[n - 1];
98+
}
99+
};
100+
```
101+
84102
### **JavaScript**
85103
86104
```js
@@ -89,20 +107,21 @@ class Solution {
89107
* @return {number}
90108
*/
91109
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);
110+
let dp = [1];
111+
let p2 = 0,
112+
p3 = 0,
113+
p5 = 0;
114+
for (let i = 1; i < n; ++i) {
115+
const next2 = dp[p2] * 2,
116+
next3 = dp[p3] * 3,
117+
next5 = dp[p5] * 5;
118+
dp[i] = Math.min(next2, Math.min(next3, next5));
119+
if (dp[i] == next2) ++p2;
120+
if (dp[i] == next3) ++p3;
121+
if (dp[i] == next5) ++p5;
122+
dp.push(dp[i]);
104123
}
105-
return res[n - 1];
124+
return dp[n - 1];
106125
};
107126
```
108127

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

Lines changed: 16 additions & 0 deletions
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+
};
Lines changed: 6 additions & 16 deletions
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

Lines changed: 14 additions & 13 deletions
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

Lines changed: 6 additions & 8 deletions
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

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,106 @@
2626

2727
<!-- 这里可写通用的实现逻辑 -->
2828

29+
动态规划法。
30+
31+
定义数组 dp,`dp[i - 1]` 表示第 i 个丑数,那么第 n 个丑数就是 `dp[n - 1]`。最小的丑数是 1,所以 `dp[0] = 1`
32+
33+
定义 3 个指针 p2,p3,p5,表示下一个丑数是当前指针指向的丑数乘以对应的质因数。初始时,三个指针的值都指向 0。
34+
35+
`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。
36+
37+
最后返回 `dp[n - 1]` 即可。
38+
2939
<!-- tabs:start -->
3040

3141
### **Python3**
3242

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

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

3962
### **Java**
4063

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

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

47131
### **...**

0 commit comments

Comments
 (0)