888. 公平的糖果棒交换

题目如下:

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

上一篇:使用jsplumb绘图,实现连线


下一篇:淘宝联盟饿了么推广 API取链转链 永久有效