给出数组a*b
,其中包含最多1e5的数字,我们必须将每个k*k
子数组中唯一数字的数量相加,
有a-k*b-k
子阵列
e.g
1 2 3 4
3 2 4 1
表示k = 2 子阵列是
{1,2,3,2}(3distinct values)
{2,3,2,4}(3distinct values)
{3,4,4,1}(3distinct values)
输出为9
是否有一种更快的方法,而不是使用一个表来存储一个按行为处理的k*k
子阵列中每个数字的计数(例如,在索引3处,我们在子阵列中存储3个数字),移动a k*k
窗口加1并从右侧添加值并从左侧移除,如果增量值为1后 - 增加唯一数字计数器;如果在递减值为0之后 - 递减唯一数字计数器。
到达行的末尾后,向下移动1并向相反方向移动。
不担心内存使用情况,我只想找到一种更快的方法
答案 0 :(得分:1)
a == b
是一种等价关系。
给定一组元素(您的子数组),您可以找到与您找到的方法的关系的等价类:
对于子数组A
中的每个元素x,您取c[x]
这是一个int(c
数组元素全部初始化为0)。如果这是c[x] == 0
,那么您有一个新的唯一元素c[x]++
。否则,您将增加c[x]
。
此算法与子阵列中的元素数量线性(显然,您为每个子阵列迭代此过程并将结果相加以得到您想要的结果)。
但时间复杂度不能低,因为无论如何你都需要检查每个元素。