📅  最后修改于: 2023-12-03 15:12:01.748000             🧑  作者: Mango
给定一个整数数组和一个整数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)$。