【发布时间】:2018-04-24 16:35:01
【问题描述】:
每个 Codefighters:
注意:写一个 O(n) 时间复杂度和 O(1) 额外空间复杂度的解决方案,因为这是你在真实面试中被要求做的事情。
给定一个数组 a,其中仅包含 1 到 a.length 范围内的数字,找到第二次出现具有最小索引的第一个重复数字。换句话说,如果有超过 1 个重复的数字,则返回第二次出现的索引比另一个数字的第二次出现的索引更小的数字。如果没有这样的元素,则返回 -1。
例子
对于 a = [2, 3, 3, 1, 5, 2],输出应该是 firstDuplicate(a) = 3。
有 2 个重复项:数字 2 和 3。第二次出现的 3 比第二次出现的 2 的索引更小,所以答案是 3。
对于 a = [2, 4, 3, 5, 1],输出应该是 firstDuplicate(a) = -1。
所以这就是我想出的。它可以工作,但在最终测试中失败,因为它运行了 4000 毫秒以上。我坚持我还能做什么。有什么提高速度的想法吗?
func firstDuplicate(a : [Int]) -> Int {
var duplicateIndexArray = [Int]()
for firstIndex in 0..<a.count {
for secondIndex in 0..<a.count {
if a[firstIndex] == a[secondIndex] && firstIndex != secondIndex {
print(firstIndex, secondIndex)
if !(duplicateIndexArray.contains(firstIndex)){
duplicateIndexArray.append(secondIndex)
break
}
}
}
}
// Check for duplicacy
if duplicateIndexArray.count > 0 {
print(duplicateIndexArray)
return a[duplicateIndexArray.min()!]
}
return -1
}
【问题讨论】:
-
a是不可变的,还是可以重新排序值?