我有n个号码。 n< = 1000000.每个数字都是正整数且小于10 ^ 9.
确定一次只会出现一个数字,休息时间会发生两次甚至多次。
我知道的最短解决方案是所有数字的XOR的结果。我想知道
答案 0 :(得分:3)
对所有数字进行异或将具有O(n)复杂度,因为您只需要访问每个元素一次。
考虑到您的要求,我想不出有任何方法可以进一步优化这一点。 XOR是一种非常便宜的操作,问题的本质要求您至少访问一次每个元素:否则,您无法知道哪个值是唯一的。
答案 1 :(得分:1)
XOR算法是正确的算法,也是最快的算法。缓慢的部分是您阅读输入的方式。
例如,C中的scanf
比使用getchar
(甚至更好getchar_unlocked
)自己编号算法的速度要慢。关于你提到的SPOJ问题,我通过做出这个改变,从1.35s到0.14s有了改进。我确信在网站上获得最佳时间的剩余0.04只是因为比我的代码更好的低级别IO。
答案 2 :(得分:0)
你可以去散列。原始解决方案是使用唯一编号作为哈希表的键。如果可以,那么您可以使用散列算法。一个简单的例子是使用数字作为数组中的索引。现在,空间太大了(我的意思太多了),但可以进一步优化。