优化给定总和的数组中的对的索引

时间:2014-02-12 19:25:48

标签: c arrays

我正在编码找到已经给出总和的数组中的所有数字索引。

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)解决方案。任何人都可以帮助我在这种情况下获得最佳解决方案。

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);
}