三数之和
给你一个包含 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; }
浙公网安备 33010602011771号