这是子集总和问题的类型
这是我的解决方案。我不知道它是否早一些。想象一下两个变量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:
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 foundn";复杂度:O(n)



