题解 | #数组中相加和为0的三元组#

数组中相加和为0的三元组

http://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

思路一:固定一个数,选择其他两个数,复杂度O(n^3)。 思路二:dfs回溯法,注意在dfs中不能sort(path)以避免回溯顺序打乱,注意多个元素共同排序的lambda。

class Solution {
public:
    void dfs(const vector<int>& num,vector<vector<int>>& result,vector<int>& path,int index){
        if(path.size()>3) return;
        if(path.size()==3){
            if(path[0]+path[1]+path[2]==0){
                //sort(path.begin(),path.end());
                result.push_back(path);
            }
            return;
        }
        for(int i=index;i<num.size();i++){
            path.push_back(num[i]);
            dfs(num,result,path,i+1);
            path.pop_back();
        }
    }
    
    vector<vector<int> > threeSum(vector<int> &num) {
        vector<vector<int>> result{};
        vector<int> path{};
        dfs(num,result,path,0);
        for(auto& vec:result) sort(vec.begin(),vec.end());
        
        auto cmp = [](vector<int> a , vector<int> b) {
		    if (a[ 0 ] == b[ 0 ]) {
			    if (a[ 1 ] == b[ 1 ]) {
				    if (a[ 2 ] == b[ 2 ]) {
					    return false;
				    }
				    else return a[ 2 ] < b[ 2 ];
			    }
			    else return a[ 1 ] < b[ 1 ];
		    }
		    else return a[ 0 ] < b[ 0 ];
	    };
        
        sort(result.begin(),result.end(),cmp);
        auto end_iter=unique(result.begin(),result.end());
        vector<vector<int>> three{result.begin(),end_iter};
        return three;
    }
};


全部评论

相关推荐

11-29 00:55
门头沟学院
区域赛银,邀请赛金,打算十二月打下Java基础、背点八股、写个外卖后去投福建小厂的寒假实习,简历应该怎么写呢?以及福州/和厦门有推荐的小厂吗?
牛客53210502...:简历一页:把区域银,邀请赛金标粗,其他的奖除非凑一页否则没有必要写。或者多页:每个站一行这样都列出来。项目经历看看牛客其他人是怎么写的,写的不好呢。简历打磨好按部就班没问题的
点赞 评论 收藏
分享
肖先生~:那年秋招闯进一位少年,人们都清楚:成功对他来说只是时间问题
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务