这是我遇到的一个常见面试问题,但是我未能按照要求进行改进。
assume we have an int array int[] A, we want to find the first duplicate entry.
几乎每个人都可以考虑使用HashSet,并在解析时将其添加到其中。这将导致O(n)时间和O(n)空间。此后,我被要求在没有其他数据结构的情况下进行解决。我说过最愚蠢的想法是在O(n ^ 2)时间里比较每个对象。然后要求我改善O(n ^ 2)时间。
为了改善它,我想到了使用固定大小的数组(假设最大数量为n),boolean [] b = new boolean [n]; 但是我不被允许使用这种方法。
然后我想到使用int变量,使用位操作,如果最大数量小于32,则对于n,我们可以向左推1到n位,然后| | | | | | | | | | |,。,,,,,,,,,,,,。到检查器,然后将&检查器移到数组中的下一个条目,以检查它是否>0。例如:
int c = A[i];
if(check & (1 << c) > 0) return false;
check |= 1 << c;
但是,这也不是。
所以有人暗示我可以将数组本身用作哈希集/哈希表和“线性哈希”吗?
有什么帮助吗?谢谢
Wikipedia定义的线性散列的优势在于,调整大小可以递增地进行,因为存储桶以循环方式被一一拆分,从而为调整大小的插入保留了固定的摊销时间复杂度。因此,他们的想法是遍历数组,重新使用已经遍历的元素作为线性哈希的存储。
虽然我不是线性哈希专家,但我看不出任何方法可以将哈希表放入数组中。当然,要使用线性哈希存储n个元素,可以使用n个存储桶。但是,存储桶中的元素数量是不受限制的,因此您需要像链表那样的东西来实现每个存储桶,这会增加指针的O(n)内存。
这样,该算法不会比普通算法产生更好的渐近空间复杂度HashSet
。但是,它确实将内存消耗减少了一个恒定的因素。
它的时间复杂度与普通的相当HashSet
。
编辑:在我看来,这个答案被忽略了(没有投票,没有评论)。它没有用吗?请发表评论,以便我知道需要改进的地方。
问题内容: 我有一个数组,正在寻找重复项。 但是,当没有重复项时,此代码不起作用。为什么? 问题答案: On the nose answer.. 编辑后切换回原来的位置,因为我在你正在使用的地方阅读过,最初的问题尚不清楚。还要设置,以将执行时间减半,但仍为O(n 2)。 A faster (in the limit) way 这是一种基于哈希的方法。你需要为自动装箱付款,但是它是O(n)而不是O(
我试图解决一个挑战,它要求您在Java中反转数组。问题是您只能获得一个,所以我假设您需要使用Streams API来完成此操作。 我尝试了传统的方法,它正确地反转了数组,但失败了一个分号测试-
问题内容: 查找整数数组中的第一个重复元素。 例如: 问题答案: 简单的解决方案是使用两个循环。外循环将遍历循环,内循环将检查元素是否重复,但此解决方案的时间复杂度为 o(n^2)。 另一种解决方案是创建另一个数组并对其进行排序。从原始数组中选取元素并使用二进制搜索在排序数组中查找元素,但此解决方案的时间复杂度为 o(n^logn)。 我们能做得更好吗? 是的,我们可以从右到左迭代并使用HashS
可能重复:数组值计数javascript 我有一个数组,其中包含几个重复项,我试图实现的是计算每个唯一字符串在这个数组中有多少重复项。 数组看起来像这样 因此我想做这样的事情 但我不确定该如何编写代码。我在想,用每个唯一的字符串创建一个对象,然后在原始数组中循环,将每个字符串与其对象匹配,并将其数字增加1,然后在对象上循环,以查看哪些单词具有最多的重复项。。。 但这似乎是一种过于复杂的方法。
之间有区别吗 和 ? 两者都起作用,结果完全相同。哪一个更快或更好?有推荐的款式指南吗?
我在团结中挣扎。我想创建一个脚本,能够找到离玩家最近的对象(我设法做到了),以及离玩家第二近的对象。我的问题是如何修改此代码,使其也适用于第二个对象?