mirror of
https://gitlab.com/mfocko/LeetCode.git
synced 2024-09-07 20:16:57 +02:00
rs: add «786. K-th Smallest Prime Fraction»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
8a68c52f38
commit
3bc4d1bb81
1 changed files with 94 additions and 0 deletions
94
rs/k-th-smallest-prime-fraction.rs
Normal file
94
rs/k-th-smallest-prime-fraction.rs
Normal file
|
@ -0,0 +1,94 @@
|
|||
use std::cmp;
|
||||
use std::collections::BinaryHeap;
|
||||
|
||||
#[derive(Eq)]
|
||||
struct Fraction {
|
||||
num: i32,
|
||||
den: i32,
|
||||
num_idx: usize,
|
||||
den_idx: usize,
|
||||
}
|
||||
|
||||
impl Fraction {
|
||||
fn new(primes: &[i32], num_idx: usize, den_idx: usize) -> Self {
|
||||
Self {
|
||||
num: primes[num_idx],
|
||||
den: primes[den_idx],
|
||||
num_idx,
|
||||
den_idx,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Ord for Fraction {
|
||||
fn cmp(&self, rhs: &Fraction) -> cmp::Ordering {
|
||||
let left = self.num * rhs.den;
|
||||
let right = rhs.num * self.den;
|
||||
|
||||
left.cmp(&right)
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialOrd for Fraction {
|
||||
fn partial_cmp(&self, rhs: &Fraction) -> Option<cmp::Ordering> {
|
||||
Some(self.cmp(rhs))
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for Fraction {
|
||||
fn eq(&self, rhs: &Fraction) -> bool {
|
||||
self.num * rhs.den == rhs.num * self.den
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Fraction> for Vec<i32> {
|
||||
fn from(f: Fraction) -> Self {
|
||||
vec![f.num, f.den]
|
||||
}
|
||||
}
|
||||
|
||||
struct Solution {}
|
||||
impl Solution {
|
||||
pub fn kth_smallest_prime_fraction(arr: Vec<i32>, k: i32) -> Vec<i32> {
|
||||
let mut heap: BinaryHeap<cmp::Reverse<Fraction>> = BinaryHeap::new();
|
||||
|
||||
let last = arr.len() - 1;
|
||||
for i in 0..arr.len() {
|
||||
heap.push(cmp::Reverse(Fraction::new(&arr, i, last)));
|
||||
}
|
||||
|
||||
for _ in 1..k {
|
||||
let smallest = heap.pop().expect("There is always at least one fraction").0;
|
||||
if smallest.den_idx - 1 > smallest.num_idx {
|
||||
heap.push(cmp::Reverse(Fraction::new(
|
||||
&arr,
|
||||
smallest.num_idx,
|
||||
smallest.den_idx - 1,
|
||||
)));
|
||||
}
|
||||
}
|
||||
|
||||
heap.pop().expect("There is always k-th smallest").0.into()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn example_1() {
|
||||
assert_eq!(
|
||||
Solution::kth_smallest_prime_fraction(vec![1, 2, 3, 5], 3),
|
||||
vec![2, 5]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn example_2() {
|
||||
assert_eq!(
|
||||
Solution::kth_smallest_prime_fraction(vec![1, 7], 1),
|
||||
vec![1, 7]
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue