三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

 

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

1、暴力解法

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

class Solution {
public:
    vector<vector<int>> threeSum(vector<int> &nums) {
        int n = nums.size();
        vector<vector<int>> occ;
        sort(nums.begin(), nums.end());
        int x, y, z;
        if (n < 3) {
            return occ;
        } else {
            for (x = 0; x < nums.size() - 2; ++x) {
                if (nums[x] > 0)
                    break;
                if (x != 0 && nums[x] == nums[x - 1])
                    continue;
                for (y = x + 1; y < nums.size() - 1; ++y) {
                    if (y != x + 1 && nums[y] == nums[y - 1])
                        continue;
                    for (z = y + 1; z < nums.size(); ++z) {
                        if (z != y + 1 && nums[z] == nums[z - 1])
                            continue;
                        if ((0 - (nums[x] + nums[y])) == nums[z]){
                            occ.push_back(vector<int>{nums[x], nums[y], nums[z]});
                        }
                        if ((0 - (nums[x] + nums[y])) < nums[z])
                            continue;
                    }
                }
            }
        }
        return occ;
    }
};

int main() {
    vector<int> v{0, 0, 0, 0, 0};
    Solution solution;
    vector<vector<int>> res = solution.threeSum(v);
    cout << res.size() << endl;
}

 

2、双指针

 

#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

class Solution {
public:
    vector<vector<int>> threeSum(vector<int> &nums) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        int n = nums.size();
        if (n < 3)
            return res;
        for (int target = 0; target < n - 2; ++target) {
            if (target != 0 && nums[target] == nums[target - 1])
                continue;
            int right = n - 1;
            int left = target + 1;
            while (left < right) {
                if (nums[left] + nums[right] + nums[target] > 0)
                    do --right; while (left < right && nums[right] == nums[right + 1]);
                else if (nums[left] + nums[right] + nums[target] < 0)
                    do ++left; while (left < right && nums[left] == nums[left - 1]);
                else if (nums[left] + nums[right] + nums[target] == 0) {
                    res.push_back(vector<int>{nums[target], nums[left], nums[right]});
                    do ++left; while (left < right && nums[left] == nums[left - 1]);
                }
            }
        }
        return res;
    }
};

int main() {
    vector<int> v{1, 1, 1};
    Solution solution;
    auto res = solution.threeSum(v);
    cout << res.size() << endl;
}

 

posted on 2021-02-20 14:19  QzZq  阅读(68)  评论(0)    收藏  举报

导航