码迷,mamicode.com
首页 > 其他好文 > 详细

GEEK编程练习— —四数求和

时间:2016-05-25 09:33:45      阅读:343      评论:0      收藏:0      [点我收藏+]

标签:

题目

输入一个特定整数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编程练习— —四数求和

标签:

原文地址:http://blog.csdn.net/sin_geek/article/details/51495635

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!