给定长度为 n 的数组,需要统计所有元素互不相同的非空子数组数量。 核心做法是双指针滑动窗口 + 计数:
l
、r
表示当前窗口 [l, r]
,并维护每个数在窗口中的出现次数(可用数组或哈希表,因数据范围 1 ≤ a[i] ≤ n
,用数组更高效)。r
逐步右移并加入元素;如果某个元素出现次数变为 2(产生重复),就不断移动左指针 l
并减少对应计数,直到窗口内再次全为互异元素。r
为右端时,所有满足条件且以 r
结尾的子数组个数正是窗口长度 r - l + 1
,累加到答案即可。相关算法:滑动窗口、双指针、频次数组/哈希表。
给定一个长度为 n 的数组 {a1,a2,...,an},请你计算其中所有子数组中,元素互不相同的子数组个数。
子数组指从原数组中连续选择的一段元素所形成的数组,要求非空。
第一行输入一个整数 n(1≤n≤2×105),表示数组长度。
第二行输入 n 个整数 a1,a2,...,an(1≤ai≤n) ,表示数组中的元素。
输出一个整数,表示满足条件的子数组个数。
输入
3
1 2 1
输出
5
说明
所有子数组共 3×4/2=6 个:
[1,1]={1} 合法;[1,2]={1,2} 合法;[1,3]={1,2,1} 存在重复 1 ,不合法;[2,2]={2} 合法;[2,3]={2,1} 合法;[3,3]={1} 合法。
合法子数组共有 5 个,故答案为 5 。