-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlib.rs
93 lines (84 loc) · 1.99 KB
/
lib.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*!
* # 215. Kth Largest Element in an Array
*
* * [Problem link](https://leetcode.com/problems/kth-largest-element-in-an-array/)
*
* ## Other Solutions
*
* The solution works but slower than sort all elements and get by index in Rust like below.
*
* ```rust,no_run
* # struct Solution {}
*
* impl Solution {
* pub fn find_kth_largest(nums: Vec<i32>, k: i32) -> i32 {
* let mut nums = nums;
* nums.sort_by(|a, b| b.cmp(a));
* nums[k as usize - 1]
* }
* }
* ```
*/
#![allow(dead_code)]
struct Solution {}
struct Queue {
k: usize,
queue: Vec<i32>,
}
impl Queue {
fn new(k: usize) -> Queue {
Queue { k, queue: vec![] }
}
fn push(&mut self, n: i32) {
let mut length = self.queue.len();
if length < self.k {
self.queue.push(n);
length += 1;
} else if self.queue[length - 1] < n {
self.queue[length - 1] = n;
} else {
return;
}
// sort queue
if length == 1 {
return;
}
for i in (1..self.queue.len()).rev() {
if self.queue[i - 1] < self.queue[i] {
self.queue.swap(i - 1, i);
} else {
break;
}
}
}
fn kth(&self) -> i32 {
self.queue[self.queue.len() - 1]
}
}
impl Solution {
pub fn find_kth_largest(nums: Vec<i32>, k: i32) -> i32 {
let mut queue = Queue::new(k as usize);
for &n in nums.iter() {
queue.push(n);
}
queue.kth()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_example1() {
let nums = vec![3, 2, 1, 5, 6, 4];
let k = 2;
let expected = 5;
assert_eq!(expected, Solution::find_kth_largest(nums, k));
}
#[test]
fn test_example2() {
let nums = vec![3, 2, 3, 1, 2, 4, 5, 5, 6];
let k = 4;
let expected = 4;
assert_eq!(expected, Solution::find_kth_largest(nums, k));
}
}