2958. 最多 K 个重复元素的最长子数组

This commit is contained in:
2026-08-13 10:27:08 +08:00
parent fe0577dd06
commit a19c7573a7
+11 -19
View File
@@ -1,34 +1,26 @@
use std::collections::HashMap;
mod arr;
struct Solution {}
impl Solution {
pub fn count_majority_subarrays(nums: Vec<i32>, target: i32) -> i64 {
let mut arr: Vec<i32> = vec![0; nums.len() + 1];
for i in 0..nums.len() {
arr[i + 1] = arr[i] + if nums[i] == target { 1 } else { -1 };
}
// [-n, n] -> [0, 2n]
let n = nums.len() as i32;
let mut pre = vec![0; nums.len() * 2 + 1];
let mut presum = 0;
pub fn max_subarray_length(nums: Vec<i32>, k: i32) -> i32 {
let mut mp = HashMap::new();
let mut l: i64 = -1;
let mut ans = 0;
println!("{:?}", arr);
for r in 0..nums.len() {
pre[(arr[r] + n) as usize] += 1;
if arr[r + 1] > arr[r] {
presum += pre[(arr[r] + n) as usize];
} else {
presum = (presum - pre[(arr[r + 1] + n) as usize]).max(0);
*mp.entry(nums[r]).or_insert(0) += 1;
while *mp.get(&nums[r]).unwrap() > k {
l += 1;
*mp.get_mut(&nums[l as usize]).unwrap() -= 1
}
ans += presum;
ans = ans.max(r as i32 - l as i32);
}
ans
}
}
fn main() {
// 1 2 2 3
// 0 -1 0 1 0
println!(
"{:?}",
Solution::count_majority_subarrays(vec![1, 2, 2, 3], 2)
Solution::max_subarray_length(vec![1, 2, 3, 1, 2, 3, 1, 2], 2)
);
}