-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathp2342.rs
71 lines (63 loc) · 2.11 KB
/
p2342.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
#[test]
fn test() {
use method2::maximum_sum;
assert_eq!(maximum_sum(vec![18, 43, 36, 13, 7]), 54);
assert_eq!(maximum_sum(vec![10, 12, 19, 14]), -1);
}
// 哈希表+最大堆
mod method1 {
pub fn maximum_sum(nums: Vec<i32>) -> i32 {
use std::collections::{BinaryHeap, HashMap};
// 键:数位和;值:数位和相等的数组成的堆
let mut map: HashMap<i32, BinaryHeap<i32>> = HashMap::new();
for num in nums {
// 求数位和
let mut tmp: i32 = num;
let mut sum: i32 = 0;
while tmp != 0 {
sum += tmp % 10;
tmp /= 10;
}
map.entry(sum)
.and_modify(|v: &mut BinaryHeap<i32>| v.push(num))
.or_insert(BinaryHeap::from([num]));
}
let mut ans: i32 = -1;
// 如果堆的长度大于2,从堆顶取两个元素出来,更新ans
for (_, v) in map.iter_mut() {
if v.len() >= 2 {
let mut sum: i32 = 0;
sum += v.pop().unwrap();
sum += v.pop().unwrap();
ans = ans.max(sum);
}
}
ans
}
}
// 在method1的基础上优化,哈希表内没必要保存数位和相等的全部元素,维护一个最大的元素就行了
mod method2 {
pub fn maximum_sum(nums: Vec<i32>) -> i32 {
use std::collections::HashMap;
let mut map: HashMap<i32, i32> = HashMap::new();
let mut ans: i32 = -1;
for num in nums {
// 求数位和
let mut tmp: i32 = num;
let mut sum: i32 = 0;
while tmp != 0 {
sum += tmp % 10;
tmp /= 10;
}
// 如果有数位和相等的元素,更新ans
if map.contains_key(&sum) {
ans = ans.max(map.get(&sum).unwrap() + num);
}
// 仅维护数位和为sum的最大元素
map.entry(sum)
.and_modify(|v: &mut i32| *v = *v.max(&mut num.clone()))
.or_insert(num);
}
ans
}
}