题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解法 双指针
首先将数组按照升序排序
这道题设定一个起始指针,限定其余两个元素都位于该指针后面。这道问题就可以转化成二数之和问题。
关键是去重,假设三个指针分别是i,j,k.
- nums[i] == num[i - 1] 此时i指针情况可以不讨论。
- num[j] + num[k] == sum 此时 于num[j],num[k]相等的元素也可以不考虑。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
if(nums.size() < 3)
return result;
int sum = 0,i = 0;
sort(nums.begin(),nums.end());
for(; i < nums.size() - 2;i++)
{
if(i > 0 &&nums[i] == nums[i - 1] ) //遇到相邻的重复元素,则后者可不用考虑。
continue;
int _2_sum = sum - nums[i];
int _2_start = i + 1;
int _2_end = nums.size() - 1;
while( _2_start < _2_end)
{
// 相同的元素和任意两个元素的组合情况都是一样的,考虑一个即可
if(nums[_2_start] + nums[_2_end] < _2_sum)
_2_start++;
else if(nums[_2_start] + nums[_2_end] > _2_sum)
_2_end--;
else if(nums[_2_start] + nums[_2_end] == _2_sum && _2_start < _2_end)
{
vector<int> temp {nums[i],nums[_2_start],nums[_2_end]};
result.push_back(temp);
while(_2_start < _2_end && nums[_2_start] == nums[_2_start+1]) //key:去重不能放在外面,因为在外面去重会漏掉结果
_2_start++;
while(_2_start< _2_end && nums[_2_end] == nums[_2_end - 1])
_2_end--;
_2_end--;
_2_start++;
}
else continue;
}
}
return result;
}
};