我通过暗斗解决了这个问题:
注意:编写一个具有O(n)时间复杂度和O(1)额外空间复杂度的解决方案,因为这是你在实际面试中要做的事情。
给定一个数组a,它只包含1到a.length范围内的数字,找到第一个重复的数字,第二个重复的数字的索引最小。换言之,如果有超过1个重复的数字,则返回第二次出现的数字的索引小于第二次出现的另一个数字的索引如果没有这样的元素,返回-1。
int firstDuplicate(int[] a) {
HashSet z = new HashSet();
for (int i: a) {
if (z.contains(i)){
return i;
}
z.add(i);
}
return -1;
}
我的解决方案通过了所有的测试。然而,我不理解我的解决方案是如何满足O(1)附加空间复杂度要求的。哈希表的大小与输入成正比,所以我认为它是O(n)空间复杂度。代码战是否错误地测试了我的算法,或者我误解了什么?
最佳答案
您的代码不具有O(1)辅助空间复杂度,因为如果给定所有不同元素的数组,哈希集可以增长到N大小。
我的猜测是,在线测试基础设施没有检查内存使用情况,或者没有正确检查内存使用情况。如果你想满足空间限制,你需要回去尝试用不同的方法解决问题。
作为提示,考虑重新排序数组元素。