📅  最后修改于: 2023-12-03 14:50:07.212000             🧑  作者: Mango
给定一个由整数组成的数组,编写一个函数来计算该数组中所有具有唯一数字的子数组的数量。
一个子数组是连续的一组数字。具有唯一数字的子数组是指其中包含的每个数字都不相同。
例如,数组 [1,2,3,1,2] 中具有唯一数字的子数组为 [1,2,3],[2,3,1] 和 [3,1,2]。
我们可以使用滑动窗口来解决这个问题。我们维护一个窗口,窗口中的元素始终是唯一的。如果一个特定的子数组具有唯一元素,则整个窗口本身也具有唯一元素。
具体来说,我们可以使用一个哈希集合来存储窗口中所有数字的出现情况。当我们扩展窗口时,我们将新元素添加到哈希集合中。如果哈希集合中已经存在这个元素,则我们需要收缩窗口,直到我们找到重复的元素并将其从哈希集合中移除。
在每一次扩展和收缩窗口时,我们可以计算窗口中所有具有唯一元素的子数组的数量。
以下是使用 Python 实现的代码:
def countSubArrays(nums: List[int]) -> int:
n = len(nums)
unique = set()
left, right = 0, 0
res = 0
while right < n:
if nums[right] in unique:
unique.remove(nums[left])
left += 1
else:
unique.add(nums[right])
res += right - left + 1
right += 1
return res
该算法的时间复杂度为 O(n),其中 n 是数组的长度。需要遍历整个数组一次,每次扩展和收缩窗口需要常数时间。因此,总时间复杂度为 O(n)。