原题:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
基本思路:(其实是left、mid、right三指针)
1. 排序
2. 先固定left,使mid、right指针从两侧向中间移动
3. 使mid、right所指值之和 等于 left所指值 的相反数
若前者偏小:mid++
若前者偏大:right--
4. 最后再移动left,并重复上述步骤
易错点:由于答案中不可以包含重复的三元组,因此三个指针 均需添加跳过重复值的操作
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end()); //排序
vector<vector<int>> ans;
int size = nums.size();
for (int left=0; left<size-2; left++) //左指针遍历范围
{
if (left > 0 && nums[left - 1] == nums[left]) continue; //左指针去重
int mid = left + 1, right = size - 1;
while (mid < right)
{
if (nums[mid] + nums[right] == -nums[left]) //三指针之和为0时
{
vector<int> temp = { nums[left],nums[mid++],nums[right--] };
ans.emplace_back(temp);
//中、右指针分别去重
while (mid<right && nums[right]==nums[right+1]) right--;
while (mid<right && nums[mid]==nums[mid-1]) mid++;
}
else if (nums[mid] + nums[right] > -nums[left])
{
right--; //中、右指针之和偏大,则左移right,使和减小
}
else
{
mid++; //反之,右移mid,使和增大
}
}
}
return ans;
}
};