Skip to content

Commit e88c014

Browse files
committed
26双周赛
1 parent 58e65bb commit e88c014

File tree

5 files changed

+232
-0
lines changed

5 files changed

+232
-0
lines changed

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ mod prob_35;
3838
mod prob_38;
3939
mod prob_39;
4040
mod prob_40;
41+
mod prob_41;
4142
mod prob_42;
4243
mod prob_45;
4344
mod prob_46;
@@ -411,6 +412,9 @@ mod prob_5374;
411412
mod prob_5375;
412413
mod prob_5377;
413414
mod prob_5379;
415+
mod prob_5397;
416+
mod prob_5398;
417+
mod prob_5399;
414418
mod prob_5380;
415419
mod prob_5381;
416420
mod prob_5382;

src/prob_41.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
impl Solution {
2+
pub fn first_missing_positive(mut nums: Vec<i32>) -> i32 {
3+
let n = nums.len();
4+
if n == 0 {
5+
return 1;
6+
}
7+
let mut ok = false;
8+
for &v in &nums {
9+
if v == 1 {
10+
ok = true;
11+
break;
12+
}
13+
}
14+
if !ok {
15+
return 1;
16+
}
17+
if n == 1 && nums[0] == 1 {
18+
return 2;
19+
}
20+
for i in 0..n {
21+
if nums[i] <=0 || nums[i] > n as i32 {
22+
nums[i] = 1;
23+
}
24+
}
25+
for i in 0..n {
26+
let w = nums[i];
27+
let t = if w > 0 {w} else {-w};
28+
if t == n as i32 {
29+
nums[0] = -t;
30+
continue;
31+
}
32+
let v = nums[t as usize];
33+
if v > 0 {
34+
nums[t as usize] = -v;
35+
}
36+
}
37+
for i in 1..n {
38+
if nums[i] > 0 {
39+
return i as i32;
40+
}
41+
}
42+
if nums[0] > 0 {n as i32} else {n as i32+1}
43+
}
44+
}
45+
46+
struct Solution;
47+
48+
#[cfg(test)]
49+
mod tests {
50+
use super::Solution;
51+
52+
#[test]
53+
fn test_first_missing_positive() {
54+
let test_cases = vec![
55+
(vec![1,1], 2),
56+
(vec![1,2,0], 3),
57+
(vec![1], 2),
58+
(vec![3,4,-1,1],2),
59+
(vec![7,8,9,11,12], 1),
60+
];
61+
for (arr, expect) in test_cases {
62+
assert_eq!(Solution::first_missing_positive(arr.clone()), expect, "arr: {:?}", arr);
63+
}
64+
}
65+
}

src/prob_5397.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use std::collections::HashSet;
2+
3+
impl Solution {
4+
pub fn simplified_fractions(n: i32) -> Vec<String> {
5+
if n == 1 {
6+
return vec![];
7+
}
8+
let mut hash = HashSet::new();
9+
for i in 2..=n {
10+
for j in 1..i {
11+
let g = Self::gcd(i, j);
12+
hash.insert((i/g, j/g));
13+
}
14+
}
15+
hash.into_iter().map(|(x,y)| format!("{}/{}",y,x)).collect()
16+
}
17+
fn gcd(mut x: i32, mut y:i32) -> i32 {
18+
if x < y {
19+
return Self::gcd(y, x);
20+
}
21+
while x%y != 0 {
22+
let m = x%y;
23+
x = y;
24+
y = m;
25+
}
26+
y
27+
}
28+
}
29+
30+
struct Solution;
31+
32+
#[cfg(test)]
33+
mod tests {
34+
use super::Solution;
35+
36+
#[test]
37+
fn test_simplified_fractions() {
38+
let test_cases = vec![
39+
(2, vec!["1/2"]),
40+
//(3, vec!["1/2","1/3","2/3"]),
41+
(4, vec!["1/2","1/3","1/4","2/3","3/4"]),
42+
];
43+
for (n, expect) in test_cases {
44+
assert_eq!(Solution::simplified_fractions(n), expect);
45+
}
46+
}
47+
}

src/prob_5398.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Definition for a binary tree node.
2+
#[derive(Debug, PartialEq, Eq)]
3+
pub struct TreeNode {
4+
pub val: i32,
5+
pub left: Option<Rc<RefCell<TreeNode>>>,
6+
pub right: Option<Rc<RefCell<TreeNode>>>,
7+
}
8+
9+
impl TreeNode {
10+
#[inline]
11+
pub fn new(val: i32) -> Self {
12+
TreeNode {
13+
val,
14+
left: None,
15+
right: None
16+
}
17+
}
18+
}
19+
use std::rc::Rc;
20+
use std::cell::RefCell;
21+
impl Solution {
22+
pub fn good_nodes(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
23+
if root.is_none() {
24+
return 0;
25+
}
26+
let mut ans = 0;
27+
let mut m = root.as_ref().unwrap().borrow().val;
28+
Self::count(&root, m, &mut ans);
29+
ans
30+
}
31+
fn count(r: &Option<Rc<RefCell<TreeNode>>>, m: i32, ans: &mut i32) {
32+
if r.is_none() {
33+
return;
34+
}
35+
let br = r.as_ref().unwrap().borrow();
36+
let val = br.val;
37+
if m <= val {
38+
*ans += 1;
39+
}
40+
let next = m.max(val);
41+
Self::count(&br.left, next, ans);
42+
Self::count(&br.right, next, ans);
43+
}
44+
}
45+
46+
struct Solution;

src/prob_5399.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use std::collections::HashMap;
2+
3+
impl Solution {
4+
pub fn largest_number(cost: Vec<i32>, target: i32) -> String {
5+
let m = target as usize;
6+
let mut max_v: HashMap<i32, usize> = HashMap::new();
7+
for i in 0..9 {
8+
if let Some(idx) = max_v.get_mut(&cost[i]) {
9+
*idx = i.max(*idx);
10+
} else {
11+
max_v.insert(cost[i], i);
12+
}
13+
}
14+
let mut f = vec![-1; m+1];
15+
let mut select = HashMap::new();
16+
f[0] = 0;
17+
for i in 0..9 {
18+
let w = cost[i];
19+
if *max_v.get(&w).unwrap() != i {
20+
continue;
21+
}
22+
for v in w..=target {
23+
let pos = (v-w) as usize;
24+
let uv = v as usize;
25+
if f[pos] >= 0 {
26+
let nval = f[pos]+1;
27+
if nval > f[uv] {
28+
f[uv] = nval;
29+
select.insert(v, vec![i]);
30+
} else if nval == f[uv] {
31+
select.entry(v).or_insert(vec![]).push(i);
32+
}
33+
}
34+
}
35+
}
36+
if f[m] <= 0 {
37+
return "0".to_owned();
38+
}
39+
let mut w = target;
40+
let mut ans = vec![];
41+
while w > 0 {
42+
let arr = select.get(&w).unwrap();
43+
let mut t = *arr.iter().max().unwrap();
44+
ans.push((t as i32+1) as u8 + b'0');
45+
w -= cost[t];
46+
}
47+
unsafe {std::str::from_utf8_unchecked(&ans).to_string()}
48+
}
49+
}
50+
51+
struct Solution;
52+
53+
#[cfg(test)]
54+
mod tests {
55+
use super::Solution;
56+
57+
#[test]
58+
fn test_largest_number() {
59+
let test_cases = vec![
60+
(vec![1,1,1,1,1,1,1,3,2], 10, "7777777777"),
61+
(vec![4,3,2,5,6,7,2,5,5], 9, "7772"),
62+
(vec![7,6,5,5,5,6,8,7,8], 12, "85"),
63+
(vec![2,4,6,2,4,6,4,4,4], 5, "0"),
64+
(vec![6,10,15,40,40,40,40,40,40], 47, "32211"),
65+
];
66+
for (cost, target, expect) in test_cases {
67+
assert_eq!(Solution::largest_number(cost.clone(), target), expect, "cost: {:?}, target: {}", cost, target);
68+
}
69+
}
70+
}

0 commit comments

Comments
 (0)