java在整数数组中查找第一个非重复数
我有一道考试题:
Given an integer array find the first number which is not repeating in array using O(N) time complexity and O(1) space complexity.
我想不出任何解决办法。我知道我可以迭代数组并维护一个linkedhashmap,它将存储数组元素和它出现的次数,最后我必须搜索hashmap来找到那个数字。空间复杂度大于O(1),但我想不出其他解决方案
我也仔细阅读了这个问题,并说阵列的最大大小将是100万。我认为,如果我们可以创建一个自定义hashmap,该hashmap将使用100万大小的固定大小数组,那么这可以在O(1)空间复杂度中实现,因为在这种情况下,所需的存储是恒定的,但如果我是正确的,则无法确定。如果还有其他解决方案,请告诉我
# 1 楼答案
在给定整数数组中查找第一个非重复数
更新:找到了更好的解决方案。 我认为我们可以使用附加的数据结构(如HashMap)在
O(n)
时间复杂度内解决它。遍历数组,将元素作为键,将数组中元素的索引位置作为映射中的值。如果密钥已经存在,则可以删除密钥-值对,或者只将值设置为-1。 遍历整个数组后,我们可以从hashmap中获取keySet(),然后找到值最低的键(忽略-1)。 所以这就是 时间复杂度:O(N) 空间复杂度:O(N)旧解决方案:我们可以通过创建另一个数组来解决这个问题,该数组是通过对给定数组进行排序得到的。这需要
O(nlogn)
时间。 然后我们可以遍历给定输入数组中的每个元素,尝试查找元素&;与排序数组中的下一个元素比较,如果对给定数组中的下一个元素重复continue,如果不重复,则在给定整数输入数组中找到第一个非重复元素时间复杂度:O(nlogn)
空间复杂度:O(n)
注:很抱歉,我没有阅读所有的评论,詹姆斯·坎泽已经在评论中提供了这个解决方案,感谢他
# 2 楼答案
我认为解决问题的诀窍是:
自:
然后,给定常数1M,空间复杂度将自动变为O(1)。笔记1M仍然是一个常量,尽管它确实是一个很大的数字。因此,我们只需要关注时间复杂性
使用
LinkedHashMap
我们可以用O(1)
添加新元素,用O(1)
检索元素,因此更新条目也需要O(1)。它也preserves the order
。因此,我们可以找到最早的条目然后,问题将通过两个步骤变得简单:
上述每个步骤都需要O(n),因此总体
time complexity
是O(2n) = O(n)
# 3 楼答案
我是用PowerShell做的
# 4 楼答案
如果除一个元素外的所有元素都有两个(或2的倍数)条目,这将是非重复的,则可以使用XOR运算符
例如:
与自身异或的任何数字都是0。因此,如果任何数字出现两次,那么在整个XOR结果中它将是0,从而在
x
中只留下非重复数字注意:如果您有一百万个数字,那么存储XOR结果的变量必须足够大