📌  相关文章
📜  具有所有唯一数字的数组的子数组计数(1)

📅  最后修改于: 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)。