题目如下:

爱丽丝和鲍勃有不同大小的糖果棒: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提供的优势。

©著作权归作者所有:来自51CTO博客作者CLEVERlBOY的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Cut the Rope Android版登場 現供免費下載
  2. 「总结」LeetCode 上一行代码就能解决的智力算法题
  3. 超简单的博弈算法题,一行代码解决!
  4. 三分钟看完「分糖果」算法问题

随机推荐

  1. android 组建添加透明度
  2. Android之代码创建布局
  3. Real Android apps leveraging db4o pers
  4. 安卓调用键盘回车键做保存或调用搜索键执
  5. android studio在模拟器上的中文乱码问题
  6. 几种常见的android Runtime异常
  7. Android中使用ALSA声卡
  8. Android 测试工具集02
  9. Android之拨号器
  10. Android 深入解析用户界面(四)