我正在编码找到已经给出总和的数组中的所有数字索引。
for(i=0;i<max;i++)
{
for(j=i+1;j<max;j++)
{
if(a[i]+a[j]==sum)
printf("%d %d\n",i,j);
}
}
其中max是数组的最大大小。 sum是数字对的总和。(数组中可能会重复值。)
但我只得到这个天真的O(n ^ 2)解决方案。任何人都可以帮助我在这种情况下获得最佳解决方案。
答案 0 :(得分:3)
对数组进行排序。的 O(NLG(n))的强>
对于数组中的每个i
O(n),对sum-i
O(lg(n))的二进制搜索总计 O(nlg(n))
O(nlg(n))的2个操作,总计 O(nlg(n))
答案 1 :(得分:2)
如果您的数组已排序,则可能具有线性复杂性:
j = max-1
for (i=0; i<j; i++) {
while (a[i] + a[j] > sum and j>i) j--;
if (a[i] + a[j] == sum) printf("%d %d\n",i,j);
}