19191 . ` 1 ` 是丑数。
20202 . ` 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**
3244``` python
3345class 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
5766class 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 */
91111var 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
0 commit comments