[leetcode题解]15. 3sum

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

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

题目很简单,给定一个数组和一个数值,在数组中找所有的三个数组合,使这三个数的和为给定数值。解题思路就是把数组进行排序,然后从前向后进行遍历,遍历到每个数时,对后面剩余的数组进行双指针求和计算,即两个指针,一个从从左侧开始,一个从右侧开始,两个元素的和如果大于数值-nums[i],则右侧指针前移,反之,左侧指针后移,相等的话则找到一组解。另外注意一下,把重复的进行排除一下,遍历数组的时候去重,双指针查找的时候也要进行去重即可。相对比较简单,不再多说,代码如下。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        int i;
        int n = 0;
        int l, r;
        int sum = 0;
        
        sort(nums.begin(), nums.end());
        n = nums.size();
        for (i = 0; i < n; i++) {
            if (i > 0 && nums[i] == nums[i - 1])
                continue;
            l = i + 1;
            r = n - 1;
            sum = -nums[i];
            while (l < r) {
                if (nums[l] + nums[r] < sum)
                    ++l;
                else if (nums[l] + nums[r] > sum)
                    --r;
                else {
                    vector<int> ele;
                    ele.push_back(nums[i]);
                    ele.push_back(nums[l]);
                    ele.push_back(nums[r]);
                    res.push_back(ele);
                    l++;
                    r--;
                    while (l < n && nums[l] == nums[l - 1])
                        ++l;
                    while (r > i && nums[r] == nums[r + 1])
                        --r;
                }
                    
            }
        }
        return res;
    }
};

本文遵从CC3.0协议转载请注明:转自凌风技术站

本文标题:[leetcode题解]15. 3sum

本文链接地址:http://www.iaccepted.net/algorithm/leetcode/196.html

相关文章