我有一个方法接受一个未排列的int数组并返回一个布尔值。 我的目标是找出是否存在唯一的数字(意味着它不会在整个数组中重复它) 例如 {1,6,2,3,3,2,1} 该方法将返回true。(因为6是唯一的)
我解决这个问题的方法是创建两个额外的数组,其大小与数组的最大值和最小值之间的差值有关。 然后,遍历数组,对于每个数字,我们将增加相应的数组位置,如果它的正数将转到第一个数组,负数到第二个。
我声称我的解决方案的空间复杂性是O(1)我是对的吗? (我只讲最坏的情况)
另外你能告诉我一个不同的方法来解决这个问题吗? 我不允许使用地图,哈希,列表或基本上不是数组的任何其他数据结构。
答案 0 :(得分:4)
您的算法使用无界空间。 (对于包含至少两个元素的任何输入数组,辅助数组可以任意大。)
我的建议是对数组进行排序,找到排序数组中与前一个和下一个元素不同的第一个元素。 (可以在O(n)空间和O(n * log(n))时间内完成排序。)
答案 1 :(得分:0)
您现在正在做的是数组a[n]
的直方图(带有排序),它与值m = max(a[i])-min(a[i])
的动态范围有关。如果你不知道它,你需要计算它需要O(n)
时间(找到min,max
)。直方图本身为O(n)
时间和O(m)
空间用于存储桶排序(不确定为什么需要2个辅助数组)。还有其他选择:
O(1)
或O(n)
空格O(n.log(n))
时间
您可以对数组进行排序,然后找到 AlexP 建议的非重复值。如果您可以更改阵列,则可以就地排序,否则您需要额外的阵列。
O(1)
空格O(n^2)
时间
测试数组中的每个数字与其他所有数字,如果找不到匹配项......
我们通常选择当时需要的东西,有时我们需要更低的空间,其他时间复杂度。
对于聪明的方法,您需要利用类似数据集的预定属性。除了它有整数值(例如它是否具有高斯分布)之外,你对它有一些了解吗?
另一个例子是,如果数据具有少量不同的值(相对于m
,因此您获得了许多重复值),那么动态值列表优于桶排序。这是O(n.log(n))
时间,但m
空间复杂度中的O(m)
会低得多,因为它代表不同的值而不是动态范围。