我正在尝试解决力扣问题 distribute-candies。这很简单,只需找到糖果种类和糖果数量一半之间的最小值。
以下是我的解决方案(耗时48ms):
以下是我的解决方案(耗时48ms):
use std::collections::HashSet;
pub fn distribute_candies(candies: Vec<i32>) -> i32 {
let sister_candies = (candies.len() / 2) as i32;
let mut kind = 0;
let mut candies_kinds = HashSet::new();
for candy in candies.into_iter() {
if candies_kinds.insert(candy) {
kind += 1;
if kind > sister_candies {
return sister_candies;
}
}
}
kind
}
然而,我发现可以使用迭代器来解决这个问题:
use std::collections::HashSet;
use std::cmp::min;
pub fn distribute_candies(candies: Vec<i32>) -> i32 {
min(candies.iter().collect::<HashSet<_>>().len(), candies.len() / 2) as i32
}
并且它耗费了36毫秒。
我不太明白为什么迭代器解决方案比我的for
循环解决方案更快。Rust 在后台执行了一些魔法优化吗?
HashSet
,每次实际大小加倍时都必须重新分配。迭代器版本可以使用向量迭代器的大小提示来分配正确大小的HashSet
。你可以通过使用HashSet::with_capacity(candies.len())
而不是HashSet::new()
来使你的代码做到同样的事情。 - Peter HallVec
... - Matthieu M.