一尘不染

2-SUM的线性时间算法

algorithm

给定一个整数x和N个不同整数的排序数组a,设计一个线性时间算法来确定是否存在两个不同的索引i和j,从而a [i] + a [j] == x


阅读 218

收藏
2020-07-28

共1个答案

一尘不染

这是子集总和问题的类型

这是我的解决方案。我不知道它是否早一些。想象一下两个变量i和j的函数的3D图:

sum(i,j) = a[i]+a[j]

对于每i一种ja[i]+a[j]都有最接近的x。所有这些(i,j)对形成 最接近x的
线。我们只需要沿着这条线走,然后寻找a[i]+a[j] == x

 int i = 0; 
 int j = lower_bound(a.begin(), a.end(), x)  -  a.begin(); 
 while (j >= 0 && j < a.size()  &&  i < a.size())  {  
    int sum = a[i]+a[j]; 
    if (sum == x)   { 
        cout << "found: " << i << " " << j << endl;  
        return;
    }
    if (sum > x)    j--;
    else            i++;
    if (i > j) break;
 }  
 cout << " not found\n";

复杂度:O(n)

2020-07-28