LeetCode 992.K 个不同整数的子数组
// 给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定独立的子数组为好子数组。
返回 A 中好子数组的数目。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarrays-with-k-different-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
// 例如,[1,2,3,1,2] 中有 3 个不同的整数:1,2,以及 3
// 这题是真的难
fn subarrays_with_k_distinct(a: Vec<i32>, k: i32) -> i32 {
return at_most_subarrays_with_k_distinct(a.clone(), k) - at_most_subarrays_with_k_distinct(a, k-1);
}
fn at_most_subarrays_with_k_distinct(a: Vec<i32>, k: i32) -> i32 {
if k < 1 {
return 0;
}
let mut freq:Vec<i32> = vec![0; a.len()+1];
let mut left = 0;
let mut right = 0;
let mut cnt:u32 = 0;
let mut ret = 0;
while right < a.len() {
let ra = a[right] as usize;
if freq[ra] == 0 {
cnt += 1;
}
freq[ra] += 1;
right += 1;
while cnt > k as u32{
let la = a[left] as usize;
freq[la] -= 1;
if freq[la] == 0 {
cnt -= 1;
}
left +=1;
}
ret = ret + right - left;
}
return ret as i32;
}
fn main() {
let num: Vec<i32> = vec![1,2];
let k = 1;
// except value is 7;
print!("result is {}", subarrays_with_k_distinct(num, k));
}