1224.最大相等频率

This commit is contained in:
游由 2022-08-18 19:18:43 +08:00
parent 7e1045ccca
commit d764340d0a
2 changed files with 58 additions and 0 deletions

View File

@ -188,6 +188,7 @@ mod q1190;
mod q1202;
mod q1203;
mod q1218;
mod q1224;
mod q1269;
mod q1281;
mod q1282;

View File

@ -0,0 +1,57 @@
use crate::Solution;
impl Solution {
/// [1224.最大相等频率](https://leetcode.cn/problems/maximum-equal-frequency/)
///
/// 2022-08-18 09:38:43
///
/// 给你一个正整数数组 `nums`,请你帮忙从该数组中找出能满足下面要求的 **最长** 前缀,并返回该前缀的长度:
///
/// * 从前缀中 **恰好删除一个** 元素后,剩下每个数字的出现次数都相同。
///
/// 如果删除这个元素后没有剩余元素存在,仍可认为每个数字都具有相同的出现次数(也就是 0 次)。
///
/// + **示例 1**
/// + **输入:** nums = \[2,2,1,1,5,3,3,5\]
/// + **输出:** 7
/// + **解释:** 对于长度为 7 的子数组 \[2,2,1,1,5,3,3\],如果我们从中删去 nums\[4\] = 5就可以得到 \[2,2,1,1,3,3\],里面每个数字都出现了两次。
/// + **示例 2**
/// + **输入:** nums = \[1,1,1,2,2,2,3,3,3,4,4,4,5\]
/// + **输出:** 13
/// + **提示:**
/// * `2 <= nums.length <= 10^5`
/// * `1 <= nums[i] <= 10^5`
/// + Related Topics
/// * 数组
/// * 哈希表
pub fn max_equal_freq(nums: Vec<i32>) -> i32 {
let (mut count, mut freq) = (std::collections::HashMap::<i32, i32>::new(), std::collections::HashMap::<i32, i32>::new());
let (mut r, mut m) = (0, 0);
for i in 0..nums.len() {
let c = count.entry(nums[i]).or_default();
if *c > 0 {
*freq.entry(*c).or_default() -= 1;
}
*c += 1;
m = m.max(*c);
*freq.entry(*c).or_default() += 1;
if m == 1 || *freq.get(&m).unwrap() * m + *freq.get(&(m - 1)).unwrap_or(&0) * (m - 1) == i as i32 + 1 && *freq.get(&m).unwrap() == 1 || *freq.get(&m).unwrap() * m + 1 == i as i32 + 1 && *freq.get(&1).unwrap_or(&0) == 1 {
r = r.max(i + 1);
}
}
r as i32
}
}
#[cfg(test)]
mod test {
use crate::Solution;
#[test]
fn test_q1224() {
assert_eq!(Solution::max_equal_freq(vec![2, 2, 1, 1, 5, 3, 3, 5]), 7);
assert_eq!(Solution::max_equal_freq(vec![1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5]), 13);
assert_eq!(Solution::max_equal_freq(vec![1, 1, 1, 2, 2, 2]), 5);
assert_eq!(Solution::max_equal_freq(vec![10, 2, 8, 9, 3, 8, 1, 5, 2, 3, 7, 6]), 8);
}
}