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;
    }

}
时间: 2024-11-08 13:30:59

GEEK编程练习— —四数求和的相关文章

GEEK编程练习— —三数求和

题目 输入一个特定整数s和一组整数,要求从这组整数中找到三个数a,b,c,使a+b+c=s.按照升序排列,输出所有满足条件的a,b,c.具体格式如下: 输入 0 -1 0 1 2 -1 -4 输出 -1 -1 2 -1 0 1 分析 先排序,然后左右夹逼,复杂度O(n^2) 此方法可以推广到k个数求和,先排序,做k-2次循环,在最内层循环左右夹逼,时间复杂度O(max(nlogn,n^(k-1))) 代码 #include <iostream> #include <vector>

GEEK编程练习— —两数求和

题目 输入一个特定整数值和一组整数,要求从这组整数中找到两个数,使这两数之和等于特定值.按照从前往后的顺序,输出所有满足条件的两个数的位置.具体格式如下: 输入 9 1 2 4 5 7 9 11 输出 2 5 3 4 分析 1)暴力解法,复杂度O(n^2),不考虑 2)hash.用哈希表存储每个数对应下标,复杂度O(n) 3)先排序,然后左右夹逼,排序O(nlogn),夹逼O(n),最终O(nlogn).但是需要的是位置,而不是数字本身,此方法不适用. 代码 #include <iostream

嵌入式 Linux系统编程(四)——文件属性

嵌入式 Linux系统编程(四)--文件属性 一.文件属性概述 Linux 文件的属性主要包括:文件的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.文件属性示例如下: 多个文件属性查看: ls -lih 1341714 -rw-r--r-- 1 root root 2.5K May 28 10:24 bit_marco.c 1341718 -rw-r--r-- 1 root root 2.1K May 28 09:08 bit_marco.c~ 1341706

嵌入式 Linux网络编程(四)——Select机制

嵌入式 Linux网络编程(四)--Select机制 一.select工作机制 poll和select,都是基于内核函数sys_poll实现的,不同在于在linux中select是从BSD Unix系统继承而来,poll则是从SYSTEM V Unix系统继承而来,因此两种方式相差不大.poll函数没有最大文件描述符数量的限制.poll和 select与一样,大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,开销随着文件描述符数量的增加而线性增大. select需要驱动程序的支持,驱动

[LintCode/LeetCode]——两数和、三数和、四数和

LintCode有大部分题目来自LeetCode,但LeetCode比较卡,下面以LintCode为平台,简单介绍我AC的几个题目,并由此引出一些算法基础. 1)两数之和(two-sum) 题目编号:56,链接:http://www.lintcode.com/zh-cn/problem/two-sum/ 题目描述: 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 1

关于shell脚本基础编程第四篇

shell脚本基础编程第四篇本章主要内容:函数 函数 function:             function 名称 { 命令 ; } 或 name () { 命令 ; }           定义 shell 函数.               创建一个以 NAME 为名的 shell 函数.当作为一个简单的命令启用时,           NAME 函数执行调用 shell 的上下文中的 COMMANDs 命令.当 NAME           被启用时,参数作为 $1...$n 被传递

48.输入任意正整数,编程判断该数是否为回文数(回文数是指从左到右读与从右到左读一样,如12321)

//1.输入一个数,将其每一位分离,并保存如一个数组 //2.判断数组最后录入的一位是第几位 //3.循环判断是否满足回问数的要求 #include<iostream> using namespace std; int main() { int n,temp; int k=0; int a[20]; cout<<"please input an number: "<<endl; cin>>n; for(int i=0;i<20;i+

编程算法 - 丑数 代码(C)

丑数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 我们把只包含因子2, 3 和 5的数称作丑数. 求按从小到大的顺序的第5个丑数. 可以设置一个数组包含所需要的丑数, 依次比较乘以2, 乘以3, 乘以5的最小的数, 最后返回结果. 如第5个丑数是5, 如1, 2, 3, 4(2*2), 5均是丑数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*ecli

生活编程(四)——学校图书馆简化

    每次在信号不好的图书馆打开图书检索的主页就是漫长的等待. 其实,所以便萌生了一个想法.我只要简单一个form就可以了.然后嵌入到移动设备就可以了.图书馆后台的查询处理是这样的 http://library.com/searchresult.aspx?anywords=%b7%bd%b7%a8&dt=ALL&cl=ALL&dp=20&sf=M_PUB_YEAR&ob=DESC&sm=table&dept=ALL anywords就是关键,之前以