Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a6aa0ac

Browse files
committed
resolve 313
1 parent c6d2e23 commit a6aa0ac

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

‎src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,3 +233,4 @@ mod n0307_range_sum_query_mutable;
233233
mod n0309_best_time_to_buy_and_sell_stock_with_cooldown;
234234
mod n0310_minimum_height_trees;
235235
mod n0312_burst_balloons;
236+
mod n0313_super_ugly_number;

‎src/n0313_super_ugly_number.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/**
2+
* [313] Super Ugly Number
3+
*
4+
* Write a program to find the n^th super ugly number.
5+
*
6+
* Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k.
7+
*
8+
* Example:
9+
*
10+
*
11+
* Input: n = 12, primes = [2,7,13,19]
12+
* Output: 32
13+
* Explanation: [1,2,4,7,8,13,14,16,19,26,28,32] is the sequence of the first 12
14+
* super ugly numbers given primes = [2,7,13,19] of size 4.
15+
*
16+
* Note:
17+
*
18+
*
19+
* 1 is a super ugly number for any given primes.
20+
* The given numbers in primes are in ascending order.
21+
* 0 < k &le; 100, 0 < n &le; 10^6, 0 < primes[i] < 1000.
22+
* The n^th super ugly number is guaranteed to fit in a 32-bit signed integer.
23+
*
24+
*
25+
*/
26+
pub struct Solution {}
27+
28+
// submission codes start here
29+
30+
use std::collections::BinaryHeap;
31+
use std::cmp::Ordering;
32+
#[derive(Eq, PartialEq)]
33+
struct Invert {
34+
base: i32,
35+
idx: usize,
36+
value: i32,
37+
}
38+
39+
impl Ord for Invert {
40+
fn cmp(&self, other: &Invert) -> Ordering {
41+
other.value.cmp(&self.value)
42+
}
43+
}
44+
45+
impl PartialOrd for Invert {
46+
fn partial_cmp(&self, other: &Invert) -> Option<Ordering> {
47+
Some(self.cmp(other))
48+
}
49+
}
50+
51+
impl Solution {
52+
pub fn nth_super_ugly_number(n: i32, primes: Vec<i32>) -> i32 {
53+
let mut vec = vec![1;1];
54+
let mut heap: BinaryHeap<Invert> = BinaryHeap::new();
55+
for &prime in primes.iter() {
56+
heap.push(Invert{base: prime, idx: 0, value: prime});
57+
}
58+
for _ in 0..n-1 {
59+
let mut min = 0;
60+
if let Some(num) = heap.peek() {
61+
min = num.value;
62+
}
63+
vec.push(min);
64+
while heap.peek().unwrap().value == min {
65+
let p = heap.pop().unwrap();
66+
heap.push(Invert{base: p.base, idx: p.idx+1, value: p.base * vec[p.idx+1]});
67+
}
68+
}
69+
*vec.last().unwrap()
70+
}
71+
}
72+
73+
// submission codes end
74+
75+
#[cfg(test)]
76+
mod tests {
77+
use super::*;
78+
79+
#[test]
80+
fn test_313() {
81+
assert_eq!(Solution::nth_super_ugly_number(12, vec![2,7,13,19]), 32);
82+
}
83+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /