给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
if(nums.size()<3)
return res;
sort(nums.begin(),nums.end()); //将整个数组排序
for(int i=0;i<nums.size()-2;i++) //先固定一个数
{
int j = i+1; //设置两个指针分别指向数组头尾(头为固定数字的后一个)
int k = nums.size()-1;
int target = 0 - nums[i];
while(j < k)
{
if(nums[j] + nums[k] == target) //等于target存入res
{
res.push_back({nums[i],nums[j],nums[k]});
while(nums[j+1] == nums[j]) //若头指针后移后发现与前一位数字相同,则继续后移直至大于上一次比较过的头指针数字
j++;
j++;
}
else if(nums[j] + nums[k] < target) //大于target尾指针前移一位;小于target头指针后移一位
j++;
else
k--;
}
while(nums[i+1] == nums[i]) //最外层被固定的数字也同理
i++;
}
return res;
}
};
思路:
- 将整个数组排序
- 先固定一个数,
target = 0-固定的数
设置两个指针分别指向数组头尾(头为固定数字的后一个),将三数相加比较,等于target存入res数组,若头指针后移后发现与前一位数字相同,则继续后移直至大于上一次比较过的头指针数字 - 大于target尾指针前移一位;小于target头指针后移一位
- 最外层被固定的数字也同理