19
19
1 . ` 1 ` 是丑数。
20
20
2 . ` n ` 不超过 1690。
21
21
22
+ 同 [ 0264.Ugly Number II] ( /solution/0200-0299/0264.Ugly%20Number%20II/README.md )
23
+
22
24
## 解法
23
25
24
26
<!-- 这里可写通用的实现逻辑 -->
25
27
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
+
26
38
<!-- tabs:start -->
27
39
28
40
### ** Python3**
32
44
``` python
33
45
class Solution :
34
46
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
39
49
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
41
51
dp[i] = min (next2, next3, next5)
42
52
if dp[i] == next2:
43
- i2 += 1
53
+ p2 += 1
44
54
if dp[i] == next3:
45
- i3 += 1
55
+ p3 += 1
46
56
if dp[i] == next5:
47
- i5 += 1
57
+ p5 += 1
48
58
return dp[n - 1 ]
49
-
50
59
```
51
60
52
61
### ** Java**
@@ -56,31 +65,42 @@ class Solution:
56
65
``` java
57
66
class Solution {
58
67
public int nthUglyNumber (int n ) {
59
- if (n < 7 ) {
60
- return n;
61
- }
62
68
int [] dp = new int [n];
63
69
dp[0 ] = 1 ;
64
- int i2 = 0 , i3 = 0 , i5 = 0 ;
70
+ int p2 = 0 , p3 = 0 , p5 = 0 ;
65
71
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;
77
77
}
78
78
return dp[n - 1 ];
79
-
80
79
}
81
80
}
82
81
```
83
82
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
+
84
104
### **JavaScript**
85
105
86
106
```js
@@ -89,20 +109,21 @@ class Solution {
89
109
* @return {number}
90
110
*/
91
111
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]);
104
125
}
105
- return res [n - 1 ];
126
+ return dp [n - 1];
106
127
};
107
128
```
108
129
0 commit comments