64,637
社区成员
发帖
与我相关
我的任务
分享
void func()
{
const size_t MAX_SIZE = 30000;
int numbers[MAX_SIZE];
hash_set<int> hs;
srand(static_cast<unsigned int>(time(0)));
for (int i = 0; i < MAX_SIZE; ++i)
{
numbers[i] = rand() | 1;
// hs.insert(numbers[i]);
}
sort(numbers,numbers+MAX_SIZE);
for (int* i = numbers+MAX_SIZE-1; i >= numbers; --i)
{
//for (int * j = i-1; j >= numbers; --j)
// if (hs.find(*i-*j) != hs.end())
// {
// cout << "FOUND! : A = " << *j << "\tB = " << *i-*j << "\tC = " << *i << endl;
// return;
// }
int* j = numbers, *k = i-1;
while(j < k)
{
if (*j + *k == *i)
{
cout << "FOUND! : A = " << *j << "\tB = " << *k << "\tC = " << *i << endl;
return;
}
else if (*j + *k > *i)
// k--;
{
int* p = upper_bound(j+1, k, *i-*j); // upper_bound return first p such that *p > *i-*j
k = p-1;
}
else if (*j + *k < *i)
// j++;
{
int* p = lower_bound(j+1, k, *i-*k); // lower_bound return first p such that *p >= *i-*k
j = p;
}
}
}
cout << "UNFOUND!" << endl;
}
bool foo(int* m, unsigned long len, int& a, int& b, int& c)
{
std::sort(m, m + len);
b = m[len - 2];
int *l, *r, *ptr;
for (unsigned long i = len - 1; i > 1; i--)
{
c = m[i];
l = m, r = m + i - 1;
while ( l < r)
{
// find for *ptr >= c - b
ptr = std::lower_bound(l, r, c - b);
a = *ptr;
if (a == c - b) return (true);
l = ptr;
// find for *ptr >= c - a
ptr = std::lower_bound(l, r, c - a);
b = *ptr;
if (b == c - a) return(true);
r = ptr - 1; // move one step at least
}
}
return (false);
}