根据您提供的方法签名,您问的实际上是 LeetCode 第 3483 题“不同三位偶数的数目”,而不是 3803 题。题目要求统计用给定数字能组成多少个不同的三位偶数,每个数字在同一个数中只能用一次,且百位不能为 0。
解题思路
最直接的方法就是三层循环暴力枚举所有可能的百位、十位、个位组合,然后用哈希集合去重。
· 枚举个位:必须是偶数,即 digit % 2 == 0。
· 枚举十位:从剩余数字中选,不能和个位是同一个索引。
· 枚举百位:从剩余数字中选,不能是 0,且不能和个位、十位是同一个索引。
· 去重与计数:将符合条件的数字放入 HashSet,最后返回其大小即为不同数字的个数。
Rust 代码实现
```rust
use std::collections::HashSet;
impl Solution {
pub fn total_numbers(digits: Vec<i32>) -> i32 {
let n = digits.len();
let mut seen = HashSet::new();
// 枚举个位 (k)
for i in 0..n {
if digits[i] % 2 != 0 {
continue;
}
// 枚举十位 (j)
for j in 0..n {
if j == i {
continue;
}
// 枚举百位 (k)
for k in 0..n {
if k == i || k == j || digits[k] == 0 {
continue;
}
// 组成三位数
let num = digits[k] * 100 + digits[j] * 10 + digits[i];
seen.insert(num);
}
}
}
seen.len() as i32
}
}
```
复杂度分析
· 时间复杂度:O(n³)。因为 digits 长度最多为 10,三层循环最多执行 1000 次,完全可以接受。
· 空间复杂度:O(m),其中 m 是生成的互不相同的三位偶数个数,用于存储 HashSet。