美文网首页
三数之和 LeetCode15

三数之和 LeetCode15

作者: 锦绣拾年 | 来源:发表于2020-01-14 17:11 被阅读0次

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
 [-1, 0, 1],
 [-1, -1, 2]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

如果没有去重,列出所有情况,可以用以下作法(比较暴力)

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<int> a;
        vector<int>b;
        vector<int> paixuhou;
        vector<vector<int>> ex;
        for(int i=0;i<nums.size();i++){
            a.push_back(nums[i]);
            b.push_back(nums[i]);
        }
        //最关键的是 如何去重 思路1:hashmap+排序 总之需要排序,记录一个数字重复的次数
        for(int i=0;i<nums.size()-2;i++){
            for(int j=i+1;j<nums.size()-1;j++){
                for(int q=j+1;q<nums.size();q++){
                    if(i!=j&&i!=q&&j!=q){
                        if(nums[i]+a[j]+b[q]==0){
                            vector<int> tmp;
                            tmp.push_back(nums[i]);
                            tmp.push_back(a[j]);
                            tmp.push_back(b[q]);
                            ex.push_back(tmp);
                            //排序
                            
                        }
                    }
                }
            }
        }
        //重点 在于 输出 去重
        return ex;
        
    }
};

但是对于这个题而言,它的难点是去重。
需要会的知识点
STL vector排序(虽然可以自己写)
然后思路类似于快排 不过挺难写的
借鉴了别人的想法。
确定了一个数之后,另一个数确实是大数组包小数组 [1【2 2】3]

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
         vector<vector<int>> ex;
        if(nums.size()<3)
            return ex;
        //vector<vector<int>> ex;
        sort(nums.begin(), nums.end());
        //a定 另外两个数加和定 b定 c一定定 所以b不能重复。
        //a可以重复吗?a不可以 因为后一个重复的a它的情况一定包括在前一个中
        for(int i=0;i<nums.size()-2;i++){
            int b=i+1;
            int c=nums.size()-1;
           if(i>0 &&nums[i]==nums[i-1])
               continue;
            while(b<c){
                int sums=nums[i]+nums[b]+nums[c];
                if(sums==0){
                    vector<int> tmp;
                    tmp.push_back(nums[i]);
                    tmp.push_back(nums[b]);
                    tmp.push_back(nums[c]);
                    ex.push_back(tmp);
                    b+=1;
                    c-=1;
                    while(b<c && nums[b]==nums[b-1])
                        b+=1;
                    while(b<c && nums[c]==nums[c+1])
                        c-=1;
                }else if(sums>0){//c过大
                    c-=1;
                    
                }else if(sums<0){//b过小
                    b+=1;
                }
                

            }
            

        }

        return ex;
        
    }
};

相关文章

  • LeetCode15 三数之和(Java实现)

    LeetCode15 三数之和(Java实现) 题目描述: 代码:

  • LeetCode练习day1-数组相关

    LeetCode16 最接近的三数之和 相似题目:LeetCode15 三数之和 题目详情 给你一个长度为 n 的...

  • 16. 3Sum Closest

    参照: LeetCode15题,三数之和的思路(https://www.jianshu.com/p/dc14750...

  • LeetCode15(三数之和)

    题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + ...

  • leetcode15:三数之和

    题目:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b...

  • 三数之和 LeetCode15

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + ...

  • leetcode15 三数之和

    这个题的关键在于去重,想要去重,最先想到的就是对数组或列表排序,排序后,依次以列表中的每个元素为起始值,查找后面的...

  • 3 双指针问题 leetcode15 三数之和

    题目描述 给定一个包含 n 个整数的数组nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + ...

  • algrithrom

    求和问题,双指针解决 done 两数之和 三数之和 最接近三数之和 四数之和 链表反转问题 done 链表反转 链...

  • LeetCode 第18题:四数之和

    1、前言 2、思路 采用三数之和的思路,原本三数之和可以分解为:数组中的一个数 + 此数右边的数求两数之和,那么四...

网友评论

      本文标题:三数之和 LeetCode15

      本文链接:https://www.haomeiwen.com/subject/bbsaactx.html