📅  最后修改于: 2023-12-03 15:22:47.516000             🧑  作者: Mango
给定一个由正整数组成的数组,计算其中有多少个子数组,满足其中的元素包含了从 1 到子数组长度的所有正整数。
输入:[1,2,3,4,5,6]
输出:3
解释:包含 1 到 1 的子数组为 [1]、[2]、[3]、[4]、[5]、[6];包含 1 到 2 的子数组为 [1,2]、[2,3]、[4,5]、[5,6];包含 1 到 3 的子数组为 [1,2,3]、[2,3,4]、[3,4,5]、[4,5,6]。因此一共有 3 个子数组满足条件。
我们可以通过枚举子数组的左右端点,来判断该子数组是否满足条件。具体的,对于一个长度为 $n$ 的子数组 $[l,r]$,我们可以检查其中的所有元素是否包含了从 $1$ 到 $r-l+1$ 的所有正整数。因此,该子数组是否满足条件的时间复杂度为 $O(n \log n)$,其中 $\log n$ 来自于快速排序或其他的排序算法。
因为我们需要枚举所有的子数组,因此总的时间复杂度为 $O(n^3\log n)$。
以下为 Python 代码实现:
def count_subarrays(arr: List[int]) -> int:
n = len(arr)
cnt = 0
for i in range(n):
for j in range(i, n):
lst = sorted(arr[i:j+1])
if all(lst[k] == k + 1 for k in range(len(lst))):
cnt += 1
return cnt