题目如下:
爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 根糖果棒的大小,B[j]是鲍勃拥有的第 j 根糖果棒的大小。
因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)
返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。
如果有多个答案,你可以返回其中任何一个。保证答案存在。
第一步,求和,算差值
第二步,得出需要交换的数
#include <iostream>
#include <vector>
bool findElesInArrays(std::vector<int>& arrays, int begin, int end, int ele)
{
if (begin > end)
{
return false;
}
int mid = (begin + end) / 2;
if (ele == arrays[mid])
{
return true;
}
else
{
bool bRet = findElesInArrays(arrays, begin, mid - 1, ele);
if (!bRet)
{
bRet = findElesInArrays(arrays, mid + 1, end, ele);
}
return bRet;
}
}
bool findElesInArrays(std::vector<int>& arrays, int ele)
{
for (int i = 0; i < arrays.size(); ++i)
{
if (arrays[i] == ele)
{
return true;
}
}
return false;
}
int getSum(std::vector<int>& vct)
{
int res = 0;
for (int i = 0; i < vct.size(); ++i)
{
res += vct[i];
}
return res;
}
int main()
{
std::vector<int> vct1{1,2,5};
std::vector<int> vct2{2,4};
int sum1 = getSum(vct1);
int sum2 = getSum(vct2);
if (sum1 > sum2)
{
if (((sum1 - sum2) % 2) != 0)
{
std::cout << "not found..." << std::endl;
return -1;
}
int interval = (sum1 - sum2) / 2;
for (int i = 0; i < vct2.size(); ++i)
{
if (findElesInArrays(vct1, 0, vct1.size() - 1, vct2[i] + interval))
{
//std::cout << "value1:" << vct2[i] + interval << ", value2:" << vct2[i] << std::endl;
std::cout << "found..." << std::endl;
return 1;
}
}
std::cout << "not found..." << std::endl;
return -1;
}
else
{
if (((sum2 - sum1) % 2) != 0)
{
return -1;
}
int interval = (sum2 - sum1) / 2;
for (int i = 0; i < vct1.size(); ++i)
{
if (findElesInArrays(vct2, 0, vct2.size() - 1, vct1[i] + interval))
{
//std::cout << "value2:" << vct1[i] + interval << ", value1:" << vct1[i] << std::endl;
std::cout << "found..." << std::endl;
return 1;
}
}
std::cout << "not found..." << std::endl;
return -1;
}
}
本解法没有过多的利用STL的特性来提升效率,说下思路:
1、求和。然后计算两个和的插值,因为要两边的值相等,所以调整的数值只能是差值的一半
2、计算要交换的数。这个从和较小的一边开始(和较大的一边开始也可以,只不过换下思路就行了),查找的函数写了两个,一个是二分查找,这种前提是给的数是有序的;如果无序,就只能挨个比较。当然最方便的还是利用STL,不过既然是锻炼思维,还是尽可能不要第一时间采用STL提供的优势。