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; mod arr;
struct Solution {} struct Solution {}
impl Solution { impl Solution {
pub fn count_majority_subarrays(nums: Vec<i32>, target: i32) -> i64 { pub fn max_subarray_length(nums: Vec<i32>, k: i32) -> i32 {
let mut arr: Vec<i32> = vec![0; nums.len() + 1]; let mut mp = HashMap::new();
for i in 0..nums.len() { let mut l: i64 = -1;
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;
let mut ans = 0; let mut ans = 0;
println!("{:?}", arr);
for r in 0..nums.len() { for r in 0..nums.len() {
pre[(arr[r] + n) as usize] += 1; *mp.entry(nums[r]).or_insert(0) += 1;
if arr[r + 1] > arr[r] { while *mp.get(&nums[r]).unwrap() > k {
presum += pre[(arr[r] + n) as usize]; l += 1;
} else { *mp.get_mut(&nums[l as usize]).unwrap() -= 1
presum = (presum - pre[(arr[r + 1] + n) as usize]).max(0);
} }
ans += presum; ans = ans.max(r as i32 - l as i32);
} }
ans ans
} }
} }
fn main() { fn main() {
// 1 2 2 3
// 0 -1 0 1 0
println!( 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)
); );
} }