题目:EPI
提示:
1、假设和为k的两个数,一个为非负数一个为负数,找出其下标。
2、若按照1的方法查找失败,则两个数肯定都为非负数或都为负数。
pair<int, int> one_nonnegative_one_negative(int* num, int length, int k)
{
pair<int, int> res(length-1, length-1);//非负、负
while (res.first >= 0 && num[res.first] < 0)
res.first--;
while (res.second >= 0 && num[res.second] >= 0)
res.second--;
while (res.first >= 0 && res.second >= 0)
{
if (num[res.first] + num[res.second] == k)
return res;
else if (num[res.first] + num[res.second] < k)//负数左移
{
do{
res.second--;
} while (res.second >= 0 && num[res.second] >= 0);
}
else//非负数左移
{
do{
res.first--;
} while (res.first >= 0 && num[res.first] < 0);
}
}
return pair<int, int>(-1, -1);
}
pair<int, int> both_the_same_sign(int* num, int length, int k)
{
if (k >= 0)//两个非负数
{
pair<int, int> res(0, length - 1);
while (res.first <length && num[res.first] < 0)
res.first++;
while (res.second >= 0 && num[res.second] < 0)
res.second--;
while (res.first <= res.second)
{
if (num[res.first] + num[res.second] == k)
return res;
else if (num[res.first] + num[res.second] < k)
{
do{
//
res.first++;
} while (res.first <= res.second && num[res.first] < 0);
}
else
{
do{
res.second--;
} while (res.first <= res.second && num[res.second] < 0);
}
}
return pair<int, int>(-1, -1);
}
else//两个负数
{
pair<int, int> res(0, length - 1);
while (res.first <length && num[res.first] >= 0)
res.first++;
while (res.second >= 0 && num[res.second] >= 0)
res.second--;
while (res.first <=res.second)
{
if (num[res.first] + num[res.second] == k)
return res;
else if (num[res.first] + num[res.second] < k)
{
do{
res.second--;
} while (res.first <= res.second && num[res.second] >= 0);
}
else
{
do{
res.first++;
} while (res.first <= res.second && num[res.first] >= 0);
}
}
return pair<int, int>(-1, -1);
}
}
pair<int, int> find_sum_is_k(int* num, int length, int k)
{
pair<int, int> res(-1, -1);
if (num == nullptr || length <= 0)
throw new exception("error");
res = one_nonnegative_one_negative(num, length, k);//一个非负,一个负
if (res.first == -1 && res.second == -1)
res = both_the_same_sign(num, length, k);//两个一样符号
return res;
}