【发布时间】:2018-02-11 08:33:11
【问题描述】:
我的算法在所有可能的连续子数组中查找唯一整数的最大数量不适用于大量整数和子数组。 例如,我必须从控制台读取总共 6 个整数,每个子数组的大小为 3。 所以,对于这种输入 5 3 5 2 3 2 我的程序应该打印 3 并且这工作正常。 第一个子数组存储 5 3 5,所以唯一整数的数量是 2。 第二个子数组存储 3 5 2 所以唯一整数的数量是 3。 第三个子数组也会打印 3 因为它存储 5 2 3 等等...
但是,我的算法似乎无法处理 100000 个子数组大小为 99877 的整数。
谁能解释一下,我做错了什么?
仅供参考:我必须使用像 LinkedList 或 ArrayDeque 这样的 Deque 实现
for (int i = 0; i < totalAmountOfIntegers; i++) {
int anyIntegerNumber = consoleInput.nextInt();
arrayDequeToStoreAllIntegers.addLast(anyIntegerNumber);
hashSetToStoreUniqueIntegers.add(anyIntegerNumber);
if (arrayDequeToStoreAllIntegers.size() == sizeOfEachArrayDequeAsSubArray) {
if (hashSetToStoreUniqueIntegers.size() > quantityOfUniqueIntegersInSubarray) {
quantityOfUniqueIntegersInSubarray = hashSetToStoreUniqueIntegers.size();
}
int firstNumberInDeque = arrayDequeToStoreAllIntegers.remove();
if (hashSetToStoreUniqueIntegers.size() == sizeOfEachArrayDequeAsSubArray) {
hashSetToStoreUniqueIntegers.remove(firstNumberInDeque);
}
}
}
【问题讨论】:
-
你在哪里从哈希集中删除值(或重置它)?您目前只计算直到第 n 个元素的不同值(始终从绝对值开始),并且永远不会从散列中删除任何元素。它与使用更大的尺寸无关。您当前的样本还应该为最后一个子数组
(2 3 2)提供错误的结果 3。相同的例如“1 2 3 1 1 1”(带有子尺寸 3)。 -
是的,你是对的。我还应该从我的 HashSet 变量 hashSetToStoreUniqueIntegers 中删除元素。每次迭代都删除一个元素,还是在每次迭代后重置我的 hashSetToStoreUniqueIntegers 会更好吗?
-
好吧,因为你不知道散列集本身有多少个“2”(这是你散列集的重点——尽管你可能想测试一个散列图),你有数一下,例如如果您应该从两个变量中删除“2”,则通过计算“arrayDequeToStoreAllIntegers”中“2”的数量。或者每次重置哈希并从“arrayDequeToStoreAllIntegers”重新填充它(参见mumpitz的答案,它就是这样做的)。第一种方法更快,但第二种方法更直接,更容易在其他情况下重复使用。
-
为了让我们知道您所说的“所有可能的子数组”是什么意思:对于 1,2,3,4,5,6 的主数组,您的意思是元素 1,2,3 ,然后是 2,3,4,然后是 3,4,5 等等,不是您可以构建的任何三元素组合,例如1,2,3; 1,2,4; 1,2,5; ... ; 2,4,6; ...等等,对吧?
-
是的,我所说的“所有可能的子数组”是指元素 1,2,3,然后是 2,3,4,然后是 3,4,5,最后是 4,5,6
标签: java algorithm hashset arraydeque