您的位置:首页 > 其它

[Lintcode]三数之和

2017-07-15 09:55 381 查看
描述:

给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。


注意事项:


在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组!!!

样例:

如S = {-1 0 1 2 -1 -4},
你需要返回的三元组集合的是:

(-1, 0, 1)
(-1, -1, 2)

       首先对原数组进行排序,然后开始遍历排序后的数组,这里注意不是遍历到最后一个停止,而是到倒数第三个就可以了,然后我们还要加上重复就跳过的处理,对于遍历到的数,我们用0减去这个数得到一个sum,我们只需要再之后找到两个数之和等于sum即可,这样一来问题又转化为了求two sum,这时候我们一次扫描,找到了等于sum的两数后,加上当前遍历到的数字,按顺序存入结果中即可,然后还要注意跳过重复数字。代码如下:
class Solution {

public:    

    /**

     * @param numbers : Give an array numbers of n integer

     * @return : Find all unique triplets in the array which gives the sum of zero.

     */

    vector<vector<int> > threeSum(vector<int> &nums) {

        // write your code here

        vector<vector<int>> res;

        sort(nums.begin(), nums.end());

        for (int k = 0; k < nums.size(); ++k) {

            if (nums[k] > 0) break;

            if (k > 0 && nums[k] == nums[k - 1]) continue;

            int target = 0 - nums[k];

            int i = k + 1, j = nums.size() - 1;

            while (i < j) {

                if (nums[i] + nums[j] == target) {

                    res.push_back({nums[k], nums[i], nums[j]});

                    while (i < j && nums[i] == nums[i + 1]) ++i;//结果不能包含重复的三元数组

                    while (i < j && nums[j] == nums[j - 1]) --j;

                    ++i; --j;

                } else if (nums[i] + nums[j] < target) ++i;

                else --j;

            }

        }//if

        return res;

    }

};

注:

1.vector< vector<int> > v(m, vector<int>(n) );是什么意思?

      定义了一个vector容器,元素类型为vector<int>,初始化为包含m个vector<int>对象,每个对象都是一个新创立的vector<int>对象的拷贝,而这个新创立的vector<int>对象被初始化为包含n个0。

每部分解析:

  构造函数vector(size_type n, const allocator_type& alloc = allocator_type())表示构造一个使用alloc分配内存(如果是初学,不用管这个,使用默认的就好)的含n个元素的vector,其中每个元素执行值初始化(对于内置类型即初始化为0)。因此vector<int>(n)表示构造一个无名且含n个0的vector<int>对象。

  构造函数vector(size_type n, const value_type& val, const allocator_type& alloc = allocator_type())表示构造一个使用alloc分配内存的含n个元素的vector,其中每个元素是val的一个拷贝。因此整条语句的含义如第一段所说。

  从结果上看,类似于创建了一个m×n的二维数组,而且可以通过v[i][j]的方式来访问元素(vector支持下标访问元素)。

2.vector<int>& a 这是什么意思?

     定义一个整形vector引用变量

3.break是结束整个循环体,continue是结束单次循环!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: