一天一道LeetCode系列

(一)题目

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

For example, given array S = {-1 0 1 2 -1 -4},
A solution set is:
(-1, 0, 1)
(-1, -1, 2)

(二)解题

这道题的关键在于:结果集合中不允许有重复。

想到的方法有两个:1、在查找过程中去重 2、在结果中去重

经过试验,结果中去重会直接超时。

1、过程中去重版本

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> vecresult;
        std::sort(nums.begin(),nums.end());
        int len = nums.size();
        if(len <3) return vecresult;
        for(int i = 0 ; i < nums.size() ;)
        {
            if(nums[i]>0) return vecresult;
            for(int j = i+1;j<nums.size()-1;)
            {
                int temp = 0-nums[i]-nums[j];
                vector<int>::iterator iter = find(nums.begin()+j+1,nums.end(),temp);
                if(iter != nums.end())
                {
                    vector<int> tempres;
                    tempres.push_back(nums[i]);
                    tempres.push_back(nums[j]);
                    tempres.push_back(*iter);
                    vecresult.push_back(tempres);
                }
                j++;
                while(j<nums.size()&&nums[j]==nums[j-1]) ++j;//去重
            }
            i++;
            while(i<nums.size()&&nums[i]==nums[i-1]) ++i;//去重
        }
        return vecresult;
    }
};

2、结果中去重版本(超时)

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> vecresult;
        std::sort(nums.begin(),nums.end());
        int len = nums.size();
        if(len <3) return vecresult;
        for(int i = 0 ; i < nums.size() ; i++)
        {
            if(nums[i]>0) return vecresult;
            for(int j = i+1;j<nums.size()-1;j++)
            {
                int temp = 0-nums[i]-nums[j];
                vector<int>::iterator iter = find(nums.begin()+j+1,nums.end(),temp);
                if(iter != nums.end())
                {
                    vector<int> tempres;
                    tempres.push_back(nums[i]);
                    tempres.push_back(nums[j]);
                    tempres.push_back(*iter);
                    if(vecresult.size()==0)
                    {
                        vecresult.push_back(tempres);
                    }
                    else{
                        vector<vector<int>>::iterator it1 = find(vecresult.begin(),vecresult.end(),tempres);
                        if(it1 == vecresult.end())//结果中去重
                        {
                            vecresult.push_back(tempres);
                        }
                    }
                }
            }
        }
        return vecresult;
    }
};

【一天一道LeetCode】#15 3Sum的更多相关文章

  1. LeetCode 15 3Sum [sort] <c++>

    LeetCode 15 3Sum [sort] <c++> 给出一个一维数组,找出其中所有和为零的三元组(元素集相同的视作同一个三元组)的集合. C++ 先自己写了一发,虽然过了,但跑了3 ...

  2. leetcode 15. 3Sum 二维vector

    传送门 15. 3Sum My Submissions Question Total Accepted: 108534 Total Submissions: 584814 Difficulty: Me ...

  3. 每日一道 LeetCode (15):二进制求和

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  4. [LeetCode] 15. 3Sum 三数之和

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  5. LeetCode——15. 3Sum

    一.题目链接:https://leetcode.com/problems/3sum/ 二.题目大意: 3和问题是一个比较经典的问题,它可以看做是由2和问题(见http://www.cnblogs.co ...

  6. LeetCode 15 3Sum(3个数求和为0的组合)

    题目链接 https://leetcode.com/problems/3sum/?tab=Description   Problem: 给定整数集合,找到所有满足a+b+c=0的元素组合,要求该组合不 ...

  7. LeetCode 15. 3Sum(三数之和)

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  8. LeetCode 15. 3Sum 16. 3Sum Closest 18. 4Sum

    n数求和,固定n-2个数,最后两个数在连续区间内一左一右根据当前求和与目标值比较移动,如果sum<target,移动较小数,否则,移动较大数 重复数处理: 使i为左至右第一个不重复数:while ...

  9. leetCode 15. 3Sum (3数之和) 解题思路和方法

    3Sum  Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find ...

  10. leetcode 15 3sum & leetcode 18 4sum

    3sum: 1 class Solution { public: vector<vector<int>> threeSum(vector<int>& num ...

随机推荐

  1. EasyUI常用组件(基础)

    ---------------------------------------------------------------------------------------------------- ...

  2. 深入解读XML解析

    一.XML是什么?有什么用? XML是指.作为配置文件存在 二.XML的基本语法 1.文档声明:很重要 在编写XML文档时,需要先使用文档声明来声明XML文档.且必须出现在文档的第一行. 作用:告知解 ...

  3. 关于bootstrap在IE8下不能支持自适应的问题

    说到这个问题,我就想吐槽下IE了,开发这么多版本,每个版本都有一些这样那样的问题不支持,别的正常的浏览器咋都能支持呢?真是垃圾浏览器!!!! 说归说,但是IE现在用的人多啊,怎么办?这个问题还是得解决 ...

  4. Java学习之栈和堆的区别

    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配 ...

  5. JAVA面向对象-----接口与类、接口之间的关系

    接口与类.接口之间的关系 大家之前都知道类与类之间的关系继承,那么接口与类之间又是怎样子的关系呢? 接口与类之间是实现关系.非抽象类实现接口时,必须把接口里面的所有方法实现.类实现接口用关键字impl ...

  6. Struts 1 之文件上传

    Struts 1 对Apache的commons-fileupload进行了再封装,把上传文件封装成FormFile对象 定义UploadForm: private FormFilefile; //上 ...

  7. windows平台下 c/c++进行http通信的教训

    由于需要使用c++开发一个桌面应用软件,需要用到http请求进行通讯,也是本人第一次进行网络相关的开发工作,遇到了不少坑. 由于是在windows下开发和使用的应用软件,自然而然想到了调用Window ...

  8. 5.Qt自定义Button按钮的实现

     1.编写自定义按钮 MyButton.h #ifndef MYBUTTON_H #define MYBUTTON_H #include <QWidget> /** * @brief ...

  9. 2.1、Android Studio通过Lint提升你的代码

    为了测试你的Android应用符合功能需求.最重要的是确保你的代码没有结构性问题.结构差的代码影响你的Android应用的可靠性,让你的代码难以维护.比如,如果你的XML资源文件包含未使用的明明空间, ...

  10. UNIX环境高级编程——创建孤儿进程

    /* 创建孤儿进程 父进程终止后,向子进程发送挂断信号,又接着发送继续信号. */ #include <stdio.h> #include <stdlib.h> #includ ...