给定一个整数x和N个不同整数的排序数组a,设计一个线性时间算法来确定是否存在两个不同的索引i和j,从而a [i] + a [j] == x
这是子集总和问题的类型
这是我的解决方案。我不知道它是否早一些。想象一下两个变量i和j的函数的3D图:
sum(i,j) = a[i]+a[j]
对于每i一种j,a[i]+a[j]都有最接近的x。所有这些(i,j)对形成 最接近x的 线。我们只需要沿着这条线走,然后寻找a[i]+a[j] == x:
i
j
a[i]+a[j]
x
(i,j)
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)