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**
3242``` python
3343class 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
5764class 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 */
91109var 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
0 commit comments