problem
264. Ugly Number II
An ugly number is a positive integer whose prime factors are limited to 2, 3, and 5.
Given an integer n, return the nth ugly number.
Example 1:
Input: n = 10
Output: 12
Explanation: [1, 2, 3, 4, 5, 6, 8, 9, 10, 12] is the sequence of the first 10 ugly numbers.
Example 2:
Input: n = 1
Output: 1
Explanation: 1 has no prime factors, therefore all of its prime factors are limited to 2, 3, and 5.
approach
class Solution {
public:
int nthUglyNumber(int n) {
if(n==1)return 1;
int id2=0, id3=0, id5=0;
vector<int> dp(n, 0);
dp[0]=1;
for(int i=1; i<n; i++){
dp[i] = min(dp[id2]*2, min(dp[id3]*3, dp[id5]*5));
if(dp[i] == dp[id2]*2) ++id2;
if(dp[i] == dp[id3]*3) ++id3;
if(dp[i] == dp[id5]*5) ++id5;
}
return dp[n-1];
}
};
time complexity
:
O
(
n
)
O(n)
O(n)
space complexity
:
O
(
n
)
O(n)
O(n)
NOTE
:
this is the sequence of the generated number, we know all the number in the sequnce res is generated from res, and the top 11 items of the sequence is : 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15
(1) 1×2, 2×2, 3×2, 4×2, 5×2, …
(2) 1×3, 2×3, 3×3, 4×3, 5×3, …
(3) 1×5, 2×5, 3×5, 4×5, 5×5, …
so how to find the 12th items ?
one solution:
we can directly iterate the 3 sequence, and find 3 number that is bigger than 15, and it’s 8x2, 6x3, 4x5, so we choose the smallest one : 16
but why not use 3 point to record the position of x, y, z ?
so the solution is like the code above.