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.
Constraints:
1 <= n <= 1690
Approach 01:
-
C++
-
Python
#include <vector>
#include <algorithm>
class Solution {
public:
int nthUglyNumber(int n) {
std::vector<int> uglyNumbers{1}; // Vector to store ugly numbers
int index2 = 0; // Pointer for multiples of 2
int index3 = 0; // Pointer for multiples of 3
int index5 = 0; // Pointer for multiples of 5
while (uglyNumbers.size() < n) {
const int nextMultipleOf2 = uglyNumbers[index2] * 2;
const int nextMultipleOf3 = uglyNumbers[index3] * 3;
const int nextMultipleOf5 = uglyNumbers[index5] * 5;
const int nextUglyNumber = std::min({nextMultipleOf2, nextMultipleOf3, nextMultipleOf5});
if (nextUglyNumber == nextMultipleOf2)
++index2;
if (nextUglyNumber == nextMultipleOf3)
++index3;
if (nextUglyNumber == nextMultipleOf5)
++index5;
uglyNumbers.push_back(nextUglyNumber);
}
return uglyNumbers.back(); // Return the nth ugly number
}
};
class Solution:
def nthUglyNumber(self, n: int) -> int:
uglyNumbers = [1] # List to store ugly numbers
index2 = 0 # Pointer for multiples of 2
index3 = 0 # Pointer for multiples of 3
index5 = 0 # Pointer for multiples of 5
while len(uglyNumbers) < n:
nextMultipleOf2 = uglyNumbers[index2] * 2
nextMultipleOf3 = uglyNumbers[index3] * 3
nextMultipleOf5 = uglyNumbers[index5] * 5
nextUglyNumber = min(nextMultipleOf2, nextMultipleOf3, nextMultipleOf5)
if nextUglyNumber == nextMultipleOf2:
index2 += 1
if nextUglyNumber == nextMultipleOf3:
index3 += 1
if nextUglyNumber == nextMultipleOf5:
index5 += 1
uglyNumbers.append(nextUglyNumber)
return uglyNumbers[-1] # Return the nth ugly number
Time Complexity
- Calculating Next Ugly Numbers:
The algorithm iteratively calculates the next ugly number by finding the minimum of the next multiples of 2, 3, and 5. This operation is performed \( n \) times, where \( n \) is the input parameter. Each iteration involves a constant amount of work, making this step \( O(n) \).
- Overall Time Complexity:
The overall time complexity of the algorithm is \( O(n) \).
Space Complexity
- Storage of Ugly Numbers:
The space required to store the ugly numbers is \( O(n) \), as the algorithm maintains a list of all ugly numbers up to the \( n \)th one.
- Pointer Variables:
The additional space used by the pointer variables (
index2,index3, andindex5) is constant, \( O(1) \). - Overall Space Complexity:
The overall space complexity is \( O(n) \) due to the storage required for the list of ugly numbers.