计算子阵列中的唯一值

时间:2017-10-20 15:22:29

标签: algorithm sub-array

给出数组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并向相反方向移动。 不担心内存使用情况,我只想找到一种更快的方法

1 个答案:

答案 0 :(得分:1)

a == b是一种等价关系。 给定一组元素(您的子数组),您可以找到与您找到的方法的关系的等价类:

对于子数组A中的每个元素x,您取c[x]这是一个int(c数组元素全部初始化为0)。如果这是c[x] == 0,那么您有一个新的唯一元素c[x]++。否则,您将增加c[x]

此算法与子阵列中的元素数量线性(显然,您为每个子阵列迭代此过程并将结果相加以得到您想要的结果)。

但时间复杂度不能低,因为无论如何你都需要检查每个元素。