我有一组数字说:1 1 2 8 5 6 6 7 8 8 4 2 ...
我想检测上述数字的子数组(给定大小,例如k)中的重复元素...例如:考虑增加k = 3的子数组。
Sub array 1 :{1,1,2}
Sub array 2 :{1,2,8}
Sub array 3 :{2,8,5}
Sub array 4 :{8,5,6}
Sub array 5 :{5,6,6}
Sub array 6 :{6,6,7}
....
所以我的算法应该检测到子阵列1,5和6包含重复的内容。 我的方法:
1)将第1个k元素复制到临时数组(向量)
2)在C ++ STL中使用#include文件...使用unique()我将确定向量的大小是否有任何变化..
如何处理这个问题的任何其他线索....因为如果给定数字的列表很大,我的方法将消耗大量的时间和空间..
答案 0 :(得分:0)
O(n)
平均时间和O(k)
空间解决方案可以构建基于散列的histogram,并迭代数组,同时为每个子列表中的元素维护#occurances。
在每次迭代中,将最外面的元素踢出(通过减少直方图中的相关入口)并添加一个新元素。
还保留一个numDupes
变量,该变量计算当前候选人中添加/删除元素时当前拥有的多少,并保持不变。
伪代码(抱歉,如果我有1个错误或其他错误,但这是个主意):
numDupes = 0
histogram = new map<int,int>;
//first set:
for each i form 0 to k:
if histogram.contains(arr[i]):
histogram.put(arr[i],histogram.get(arr[i]) + 1)
numDupes += 1
else:
histogram.put(arr[i],1)
//each iteration is for a new set
if (numDupes > 0) print 1 //first sub array has dupes
for each i from k to n:
if (histogram.get(arr[i-k]) > 1) numDupes -= 1 //we just removed a dupe
histogram.put(arr[i-k],histogram.get(arr[i-k] - 1)) //take off "eldest" element.
if (histogram.contains(arr[i]) && histogram.get(arr[i]) > 0):
histogram.put(arr[i],histogram,get(arr[i]) + 1))
numDupes += 1 //we just added a dupe
else:
histogram.put(arr[i],1)
if (numDupes > 0) print i-k+1 // the current sub array contains a dupe
最初的答案有一个小错误:当最后一个元素添加没有引起欺骗时,它无法捕获案例,但仍有一个(如示例中的子数组6)。
它可以通过维持一个额外的整数来计算,该整数计算找到的当前欺骗的数量,并在计数器大于0时打印子数组。(更新伪代码)。
另请注意:要获得O(k)
空格,您的histogram
需要在值为0时删除元素。