GEEK编程练习— —四数求和

Posted Sin_Geek

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GEEK编程练习— —四数求和相关的知识,希望对你有一定的参考价值。

题目

输入一个特定整数s和一组整数,要求从这组整数中找到四个数a,b,c,d,使a+b+c+d=s。按照升序排列,输出所有满足条件的a,b,c,d。具体格式如下:

输入

0
1 0 -1 0 -2 2

输出

-2 -1 1 2
-2 0 0 2
-1 0 0 1

分析

先排序,可以用hashmap缓存两个数的和,然后左右夹逼,时间复杂度O(n^2),空间复杂度O(n^2)

代码

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

int main()
{
    int target;
    cin >> target;
    int tmp;
    vector<int> nums;
    while (cin >> tmp)
        nums.push_back(tmp);

    vector<vector<int>> result;
    if (nums.size() < 4)
        return 0;

    sort(nums.begin(), nums.end());
    unordered_multimap<int, pair<int, int>> cache;

    for (int i = 0; i < nums.size() - 1; ++i)
        for (int j = i + 1; j < nums.size(); ++j)
            cache.insert(make_pair(nums[i] + nums[j], make_pair(i, j)));

    for (auto i = cache.begin(); i != cache.end(); ++i)
    {
        int x = target - i->first;
        auto range = cache.equal_range(x);
        for (auto j = range.first; j != range.second; ++j)
        {
            auto a = i->second.first;
            auto b = i->second.second;
            auto c = j->second.first;
            auto d = j->second.second;
            if (a != c && a != d && b != c && b != d)
            {
                vector<int> vec = { nums[a], nums[b], nums[c], nums[d] };
                sort(vec.begin(), vec.end());
                result.push_back(vec);
            }
        }
        sort(result.begin(), result.end());
        result.erase(unique(result.begin(), result.end()), result.end());
    }

    for (auto i = 0; i != result.size(); ++i)
    {
        for (auto j = 0; j != result[i].size(); ++j)
        {
            cout << result[i][j] << ends;
        }
        cout << endl;
    }

}

以上是关于GEEK编程练习— —四数求和的主要内容,如果未能解决你的问题,请参考以下文章

GEEK编程练习— —两数求和

数组练习题:两数之和三数之和四数之和

GEEK编程练习— —雨水存储问题

GEEK编程练习— —格雷码

GEEK编程练习— —发糖果问题

函数练习题-素数求和