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
手动创造出所有的 ugly number, 然后找出第 n 个, ugly number 乘以 2、3、5 还是 ugly number, 对生成的 ugly numbers 进行排序
use std::cmp::Reverse;
use std::collections::{BinaryHeap, HashSet};
impl Solution {
pub fn nth_ugly_number(n: i32) -> i32 {
let mut heap: BinaryHeap<Reverse<i64>> = vec![Reverse(1)].into_iter().collect();
let mut set: HashSet<i64> = HashSet::new();
let mut count = 0;
while count < n {
let Reverse(v) = heap.pop().unwrap();
count += 1;
if count == n {
return v as i32;
}
if !set.contains(&(v * 2)) {
set.insert(v * 2);
heap.push(Reverse(v * 2));
}
if !set.contains(&(v * 3)) {
set.insert(v * 3);
heap.push(Reverse(v * 3));
}
if !set.contains(&(v * 5)) {
set.insert(v * 5);
heap.push(Reverse(v * 5));
}
}
unreachable!()
}
}