【发布时间】:2016-01-23 06:30:47
【问题描述】:
我遇到了这个问题,我被困在这个问题上。它说,
给定一组整数 N 和一个整数 y,判断是否存在 N 中绝对差等于 y 的两个元素,并且 打印这些数字。该算法应该花费 O(n lg n) 时间。 证明你的算法在 O(n lg n) 时间内运行的原因。例如令 N= 3 , 7, 2, 1, 4, 10 y = 1 N 中有三对元素 绝对差是 1 对 1 = |3 - 2| = |-1| = 1 对 2 = |3 - 4|= |-1| = 1 对 3 = |2 -1| = 1
我在 C++ 中进行了如下尝试,但它不能处理所有边界情况,例如上例中的 if y=8,它不打印任何内容,但应该打印 (2,10)。
vector<int> printPairs(vector<int> N1, vector<int> N2, int y){
int a = 0, b = 0;
vector<int> result;
while (a < N1.size() && b < N2.size()){
if (N1[a] < N2[b]){
result.push_back(N1[a]);
if (abs(N1[a] - N2[b]) == y)
cout << "(" << N1[a] << "," << N2[b] << ")" << endl;
a++;
}
else {
result.push_back(N2[b]);
if (abs(N1[a] - N2[b]) == y)
cout << "(" << N1[a] << "," << N2[b] << ")" << endl;
b++;
}
}
while (a < N1.size())
result.push_back(N1[a++]);
while (b < N2.size()){
result.push_back(N2[b++]);
}
return result;
}
vector <int> getPairs(vector<int> N, int y){
if (N.size() == 1)
return N;
vector <int> firstHalf = getPairs(vector<int>(N.begin(), N.begin() + N.size() / 2), y);
vector <int> secondHalf = getPairs(vector<int>(N.begin() + ceil(N.size() / 2), N.end()), y);
return printPairs(firstHalf, secondHalf, y);
}
【问题讨论】: