三数之和 LeetCode15

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

            }
            

        }

        return ex;
        
    }
};

你可能感兴趣的:(三数之和 LeetCode15)