【发布时间】:2017-08-12 21:22:20
【问题描述】:
根据问题陈述:
写一个时间复杂度为 O(n) 且额外空间为 O(1) 的解 复杂。给定一个数组 a 只包含范围内的数字 从 1 到 a.length,找到第一个重复的数字 第二次出现的索引最小。换句话说,如果有 超过 1 个重复的数字,返回第二个的数字 出现的索引小于另一个的第二次出现 号码可以。如果没有这样的元素,返回 -1
我根据约束遵循了我的代码,但仍然遇到时间复杂度错误。这是我的解决方案:
int firstDuplicate(std::vector<int> a)
{
long long int n = a.size();
int cnt=0;
for(long long int i=0;i<n;i++)
{
//cout<<a[i]<<" "<<cnt<<endl;
if(a[i]==n||a[i]==-n)
{ cnt++;
if(cnt>1)
return n;
}
else if(a[abs(a[i])]<0)
return -a[i];
else
a[a[i]] = -a[a[i]];
}
return -1;
}
谁能建议我更好的算法或者这个算法有什么问题?
【问题讨论】:
-
如果你需要帮助调试你的程序,你必须说它有什么问题。这可能涉及找到它没有完成预期或太慢的测试用例。某些网站产生“时间复杂度错误”是不够的。
-
@PaulHankin 代码在 10^5 范围内的 n 值非常大时失败。我不能在这里提供测试用例。毫无疑问,上面的代码在给定的测试用例上成功运行(范围为 10^3 - 10^4。
-
也许在小测试用例上运行代码并检查越界数组访问。
标签: algorithm