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>
#include <algorithm>

using namespace std;

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

    vector<int> result;
    if (nums.size() < 3)
        return 0;
    sort(nums.begin(),nums.end());

    auto last = nums.end();
    for (auto i = nums.begin(); i < last - 2; ++i)
    {
        auto j = i + 1;
        //跳过重复数
        if (i > nums.begin() && *i == *(i - 1))
            continue;
        auto k = last - 1;
        while (j < k)
        {
            if (*i + *j + *k < target)
            {
                ++j;
                //跳过重复数
                while (*j == *(j - 1) && j < k)
                    ++j;
            }
            else if (*i + *j + *k > target)
            {
                --k;
                //跳过重复数
                while (*k == *(k + 1) && j < k)
                    --k;
            }
            else
            {
                result.push_back(*i);
                result.push_back(*j);
                result.push_back(*k);
                ++j;
                --k;
                //跳过重复数
                while (*k == *(k + 1) && *j == *(j - 1) && j < k)
                    ++j;
            }
        }
    }

    for (auto i = 0; i < result.size(); i += 3)
    {
        cout << result[i]<< ends << result[i + 1] << ends << result[i + 2] << endl;
    }
    return 0;
}
时间: 2024-08-28 01:00:31

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

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

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 <u

LeetCode-3Sum -三数求和-有序数组扫描

https://oj.leetcode.com/problems/3sum/ 先排序.然后枚举i属于[0,n-3]的这些数作为三元组的第一个数,令x=0-a[i].这样就变成从[i+1,n)找出两个数加起来和等于x. 由于这些数是有序数,可以使用l,r指针对在两侧向中间逼近.这利用了一个事实:如果al+ar=x;对于l'<l,r'<r,则一定由al'+ar'<x.右边也是一样,所以可以这样向中间逼近的查找. 另外要注意答案需要去除重复. typedef pair<int,pair&

LeetCode15题: 寻找三数和,附完整代码

本文始发于个人公众号:TechFlow 今天介绍的算法题是LeetCode 15题,3 Sum,也成三数求和问题. Link 3Sum 难度 Medium 描述 给定一个整数的数组,要求寻找当中所有的a,b,c三个数的组合,使得三个数的和为0.注意,即使数组当中的数有重复,同一个数也只能使用一次. Given an array nums of n integers, are there elements a , b , c in nums such that a + b + c = 0? Fin

【转】apue《UNIX环境高级编程第三版》第一章答案详解

原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此,我要感谢网易的一个工程师朋友和室友,没有他们,我不会开始真正的学习这本书,希望大家以后开始慢慢进步.废话少说,直接上课后习题了. UNIX高级编程第一章习题答案: 1.1在系统上验证,除根目录外,目录l和l l是不同的. 答:这个验证有很多方法可使用命令ls .cd.vim等,目录.指向当前目录,目录..指

嵌入式 Linux系统编程(三)——标准IO库

嵌入式 Linux系统编程(三)--标准IO库 与文件IO函数相类似,标准IO库中提供的是fopen.fclose.fread.fwrite等面向流对象的IO函数,这些函数在实现时本身就要调用linux的文件IO这些系统调用. 一.标准IO库函数的缓冲机制 由于IO设备的访问速度与CPU的速度相差好几个数量级,为了协调IO设备与CPU的速度的不匹配,对于块设备,内核使用了页高速缓存,即数据会先被拷贝到操作系统内核的页缓存区中,然后才会从操作系统内核的缓存区拷贝到应用程序的地址空间. 当应用程序尝

iOS网络编程开发GET请求和POST请求

iOS网络编程开发GET请求和POST请求 一.GET请求和POST请求简单说明 创建GET请求 // 1.设置请求路径 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]; NSURL *url=[NSURL URLWithString:urlStr]

js模块化编程(三):Require.js的用法

转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的用法 介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战.我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多

【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数

本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O复用适用于以下场合: (1) 当客户处理多个描述符(一般是交互式输入或网络套接字),必须适用I/O复用 (2) 当一个客户处理多个套接字时,这种情况很少见,但也可能出现 (3) 当一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般就要使用I/O复用 (4) 如果一个服务器既要适用TCP,