From 2abd500a5683c10993bcdec18b401e6a62ca20e5 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Sat, 11 Oct 2025 07:08:35 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.3186 --- .../README.md | 47 +++++++++++++++++++ .../README_EN.md | 47 +++++++++++++++++++ .../Solution.rs | 42 +++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 solution/3100-3199/3186.Maximum Total Damage With Spell Casting/Solution.rs diff --git a/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/README.md b/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/README.md index 0f90dde7130b7..cf261ab658071 100644 --- a/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/README.md +++ b/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/README.md @@ -257,6 +257,53 @@ function maximumTotalDamage(power: number[]): number { } ``` +#### Rust + +```rust +use std::collections::HashMap; + +impl Solution { + pub fn maximum_total_damage(mut power: Vec) -> i64 { + power.sort(); + let n = power.len(); + let mut cnt = HashMap::new(); + let mut nxt = vec![0; n]; + let mut f = vec![-1_i64; n]; + + for i in 0..n { + *cnt.entry(power[i]).or_insert(0) += 1; + let j = match power[i + 1..].binary_search_by(|&x| x.cmp(&(power[i] + 2 + 1))) { + Ok(pos) | Err(pos) => i + 1 + pos, + }; + nxt[i] = j; + } + + fn dfs( + i: usize, + n: usize, + power: &Vec, + nxt: &Vec, + f: &mut Vec, + cnt: &HashMap, + ) -> i64 { + if i >= n { + return 0; + } + if f[i] != -1 { + return f[i]; + } + let c = *cnt.get(&power[i]).unwrap(); + let a = dfs(i + c as usize, n, power, nxt, f, cnt); + let b = power[i] as i64 * c as i64 + dfs(nxt[i], n, power, nxt, f, cnt); + f[i] = a.max(b); + f[i] + } + + dfs(0, n, &power, &nxt, &mut f, &cnt) + } +} +``` + diff --git a/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/README_EN.md b/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/README_EN.md index ba65c0307dfa9..980ffe0f46e9a 100644 --- a/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/README_EN.md +++ b/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/README_EN.md @@ -255,6 +255,53 @@ function maximumTotalDamage(power: number[]): number { } ``` +#### Rust + +```rust +use std::collections::HashMap; + +impl Solution { + pub fn maximum_total_damage(mut power: Vec) -> i64 { + power.sort(); + let n = power.len(); + let mut cnt = HashMap::new(); + let mut nxt = vec![0; n]; + let mut f = vec![-1_i64; n]; + + for i in 0..n { + *cnt.entry(power[i]).or_insert(0) += 1; + let j = match power[i + 1..].binary_search_by(|&x| x.cmp(&(power[i] + 2 + 1))) { + Ok(pos) | Err(pos) => i + 1 + pos, + }; + nxt[i] = j; + } + + fn dfs( + i: usize, + n: usize, + power: &Vec, + nxt: &Vec, + f: &mut Vec, + cnt: &HashMap, + ) -> i64 { + if i >= n { + return 0; + } + if f[i] != -1 { + return f[i]; + } + let c = *cnt.get(&power[i]).unwrap(); + let a = dfs(i + c as usize, n, power, nxt, f, cnt); + let b = power[i] as i64 * c as i64 + dfs(nxt[i], n, power, nxt, f, cnt); + f[i] = a.max(b); + f[i] + } + + dfs(0, n, &power, &nxt, &mut f, &cnt) + } +} +``` + diff --git a/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/Solution.rs b/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/Solution.rs new file mode 100644 index 0000000000000..acc25bf635b0c --- /dev/null +++ b/solution/3100-3199/3186.Maximum Total Damage With Spell Casting/Solution.rs @@ -0,0 +1,42 @@ +use std::collections::HashMap; + +impl Solution { + pub fn maximum_total_damage(mut power: Vec) -> i64 { + power.sort(); + let n = power.len(); + let mut cnt = HashMap::new(); + let mut nxt = vec![0; n]; + let mut f = vec![-1_i64; n]; + + for i in 0..n { + *cnt.entry(power[i]).or_insert(0) += 1; + let j = match power[i + 1..].binary_search_by(|&x| x.cmp(&(power[i] + 2 + 1))) { + Ok(pos) | Err(pos) => i + 1 + pos, + }; + nxt[i] = j; + } + + fn dfs( + i: usize, + n: usize, + power: &Vec, + nxt: &Vec, + f: &mut Vec, + cnt: &HashMap, + ) -> i64 { + if i >= n { + return 0; + } + if f[i] != -1 { + return f[i]; + } + let c = *cnt.get(&power[i]).unwrap(); + let a = dfs(i + c as usize, n, power, nxt, f, cnt); + let b = power[i] as i64 * c as i64 + dfs(nxt[i], n, power, nxt, f, cnt); + f[i] = a.max(b); + f[i] + } + + dfs(0, n, &power, &nxt, &mut f, &cnt) + } +}