创建一个函数,用于检查数组是否具有两个相反的元素,但复杂度低于n ^ 2.让我们使用数字.
显然最简单的方法是:
bool opposite(int* arr, int n) // n - array length
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
if(arr[i] == - arr[j])
return true;
}
}
return false;
}
我想问一下你们是否有人能想到一个复杂度小于n ^ 2的算法.
我的第一个想法如下:
1)排序数组(具有最差情况复杂度的算法:n.log(n))
2)创建两个新数组,填充原始数组中的负数和正数
(到目前为止,我们已经 – > n.log(n)n n = n.log(n))
3)…比较两个新阵列以确定它们是否具有相反的数字
我不太确定我的想法是否正确,但我对建议持开放态度.
最佳答案 一个重要的替代解决方案如下.对数组进行排序.创建两个指针,一个最初指向前面(最小),一个最初指向后面(最大).如果两个指向元素的总和为零,那么就完成了.如果它大于零,则递减后退指针.如果它小于零,则递增前指针.继续,直到两个指针相遇.
这个解决方案通常是人们正在寻找的;通常他们会通过说你只有O(1)额外空间来明确排除哈希表和树.