📌  相关文章
📜  计算具有至少K个元素的子数组至少出现两次(1)

📅  最后修改于: 2023-12-03 15:12:01.748000             🧑  作者: Mango

计算具有至少K个元素的子数组至少出现两次

题目描述

给定一个整数数组和一个整数K,计算所有具有至少K个元素的子数组中至少出现两次的子数组数量。

思路

我们可以使用哈希表来存储每个数字出现的次数。然后我们可以遍历所有长度不小于K的子数组,并对每个子数组中出现的数字个数进行统计。如果某个数字出现的个数大于等于2,则说明该子数组至少出现两次。最后我们统计所有满足条件的子数组数量即可。

代码实现
def count_subarrays(arr: list[int], k: int) -> int:
    count = 0
    freq = {}
    for i in range(len(arr)):
        for j in range(i, len(arr)):
            freq[arr[j]] = freq.get(arr[j], 0) + 1
            if j - i + 1 >= k:
                flag = False
                for f in freq.values():
                    if f >= 2:
                        flag = True
                        break
                if flag:
                    count += 1
            if j - i + 1 >= k:
                freq[arr[i]] -= 1
                if freq[arr[i]] == 0:
                    del freq[arr[i]]
                if len(freq) == 0:
                    break
    return count

上述代码实现了题目描述中的思路,通过遍历所有长度不小于K的子数组,并对每个子数组中出现的数字个数进行统计,并统计所有满足条件的子数组数量。

复杂度分析

时间复杂度:$O(n^3)$,其中$n$是数组的长度。我们需要枚举所有长度不小于K的子数组,所以时间复杂度为$O(n^2)$,而每次统计一个子数组中出现的数字的个数需要$O(n)$的时间,因此总的时间复杂度为$O(n^2\times n)=O(n^3)$。

空间复杂度:$O(n)$,我们需要用哈希表来存储每个数字出现的次数,因此空间复杂度为$O(n)$。