我试图使用“ lower_bound”函数解决1099。Leetcode的两个S小于K问题。
我正在尝试找到最大数目A [j],这使A [i] + A [j] 示例1:
输入:A = [34,23,1,24,75,33,54,8],K = 60
输出:58
说明:
我们可以使用34和24求和,得出58小于60。 示例2”
输入:A = [10,20,30],K = 15
输出:-1
说明:
在这种情况下,不可能获得小于15的一对和。int twoSumLessThanK(vector<int>& A, int K) {
sort(A.begin(), A.end());
int curMax = -1;
for(int i = 0; i < A.size(); i++) {
vector<int>::iterator low = lower_bound(begin(A), end(A), K - A[i]);
if (low != A.end()) {
curMax = max(curMax, *low + A[i]);
}
}
return curMax;
}
答案 0 :(得分:3)
您的逻辑是错误的,因为lower_bound
将返回与您要搜索的值>=
相同的结果。
这种代码变体有效
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int twoSumLessThanK(vector<int>& A, int K) {
sort(A.begin(), A.end());
int curMax = -1;
for(int i = 0; i < A.size(); i++) {
vector<int>::iterator low = upper_bound(begin(A), end(A), K - A[i]);
if (low != A.begin()) {
--low;
curMax = max(curMax, *low + A[i]);
}
}
return curMax;
}
int main()
{
vector<int> x{34,23,1,24,75,33,54,8};
cout << twoSumLessThanK(x, 60) << '\n';
vector<int> y{10,20,30};
cout << twoSumLessThanK(y, 15) << '\n';
}
即找到大于的元素,然后退后一步。