本题可用滑动窗口(双指针)与“上一次出现位置”数组配合来线性解决。
设左右指针分别为 L、R,窗口表示当前考虑的子数组区间 [L, R],并维护每个数上一次出现的位置 last[x]。当把 a[R] 纳入窗口时:
a[R] 最近一次出现的位置 last[a[R]] 在当前窗口内(last[a[R]] ≥ L),说明发生重复,需要把左指针移动到 last[a[R]] + 1,以保证窗口内元素仍然互不相同;L。给定一个长度为 n 的数组 {a1,a2,...,an} 请你计算其中所有子数组中,元素互不相同的子数组个数。
子数组指从原数组中连续选择的一段元素所形成的数组,要求非空。