【3Sum】cpp

题目

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

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.
    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

代码

class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
            std::vector<std::vector<int> > ret_vector;
            if (num.size() < 3)
            {
                return ret_vector;
            }
            // sort the vector
            std::sort(num.begin(), num.end());
            // visit all the left side element of the current element
            const int target = 0;
            std::vector<int>::iterator end = num.end();
            for (std::vector<int>::iterator i = num.begin(); i != end-2; ++i){
                // ignore first duplicate i
                if ( i > num.begin() && *i==*(i-1)) continue;
                std::vector<int>::iterator j = i+1;
                std::vector<int>::iterator k = end-1;
                while (j<k){
                    const int tmp = *i+*j+*k;
                    if ( tmp < target ){
                        ++j;
                        while ( *j==*(j-1) && j<k ) ++j;
                    }
                    else if ( tmp > target ){
                        --k;
                        while ( *k==*(k+1) && j<k ) --k;
                    }
                    else{
                        int tmp_triple[3] = {*i,*j,*k};
                        std::vector<int> tmp_vector(tmp_triple,tmp_triple+3);
                        ret_vector.push_back(tmp_vector);
                        ++j;
                        --k;
                        while( *j==*(j-1) && *k==*(k+1) && j<k ) {
                            ++j;
                            --k;
                        }
                    }
                }
            }
            return ret_vector;
    }
};

Tips:

1. 先对传入的vector排序,然后从前向后遍历。原则是:包含*i元素,且满足条件的triple都加入到返回结果中

2. 这里比较困难的一点是排除重复的triple,大概想一想原则,一些极端的case只能试验出来了

另,在mac上编辑的,不知道为什么用数组初始化vector编译不通过,所以采用了比较麻烦的传参方式

时间: 2024-07-30 21:23:58

【3Sum】cpp的相关文章

【4Sum】cpp

题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: Elements in a quadruplet (a,b,c,d) must be in non-descending or

【Combinations】cpp

题目: Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example,If n = 4 and k = 2, a solution is: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 代码: class Solution { public: vector<vector<int>> combine

【Anagrams】 cpp

题目: Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. 代码: class Solution { public: vector<string> anagrams(vector<string>& strs) { vector<string> ret; map<string,vec

【Triangle 】cpp

题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following triangle [ [2], [3,4], [6,5,7], [4,1,8,3] ] The minimum path sum from top to bottom is 1

【N-Queens】cpp

题目: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. Given an integer n, return all distinct solutions to the n-queens puzzle. Each solution contains a distinct board configuration

【Permutations】cpp

题目: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1]. 代码: class Solution { public: vector<vector<int>> permute(vector&

【Subsets】cpp

题目: Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. For example,If nums = [1,2,3], a solution is: [ [3], [1], [2], [

【转】linux configure报错configure: error: C++ preprocessor “/lib/cpp” fails sanity 的解决办法

/lib/cpp fails sanity check的解决 在某些软件的时候,运行./configure 会报错,错误提示为: configure: error: C++ preprocessor “/lib/cpp” fails sanity  check See `config.log’ for more details 解决办法:出现该情况是由于c++编译器的相关package没有安装,以root用户登陆,在终端上执行: # yum install glibc-headers # yum

【Pascal&#39;s Triangle】cpp

题目: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 代码: class Solution { public: vector<vector<int>> generate(int numRows) { vector<vector