解决方案取决于您的要求。如果你有一个小的数组大小(n,在每次插入时扫描数组就足够了,但是如果你有一个大数组并且频繁插入,我会提出一个不同的解决方案。
在每次插入时扫描数组将需要 O(n) 的复杂度。对于小数字,开销可以忽略不计,但随着数组大小的增加,每次插入的遍历效率都很低。
如果您需要性能并且内存不是您的限制,您可以使用一个布尔数组并将所有元素初始化为 false。然后每当得到一个数字时,将其在布尔数组中的索引值设为true,并在插入时检查该布尔值是否在被插入元素的索引号处。
这里是初始化布尔数组的代码(初始化它会使所有元素都为假):
boolean [] duplicateValuesArray = new boolean[Integer.MAX_VALUE];
这是在数组中插入元素的函数:
public void insertElement(int elementToBeInserted) {
if(!duplicateValuesArray[elementToBeInserted]) //check if element already in array
duplicateValuesArray[elementToBeInserted] = true;
mainArray[index++] = elementToBeInserted;
}
这样,每当你得到一个数字,布尔数组中那个索引的值就会被设置为true,并且在插入时,每次检查索引,如果值是true ,该元素存在于数组中,请勿插入。
如果你有一个大的 mainArray (n>10^6) 并且你有频繁的插入,那么这个复杂度会低得多。这是因为,初始化一个布尔数组是一次 O(n) 复杂度,之后,检查布尔数组中的元素并插入元素只是 O(1) 操作,在恒定时间内发生。
因此有效的复杂性被降低到仅仅初始化布尔数组。即使在内存占用方面,我也不介意,因为布尔基元只占用内存中的一位。
P.S:基本上这是内存与性能的权衡,这就是通用计算的权衡,随处可见。