一、题目描述
15. 三数之和
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请
你返回所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
注意重复表示每个元素不能一一对应
二、题目解析
算法思想:排序+双指针
思路:
- 先排序
- 固定一个数a;
- 在该数后面的区间内,利用“双指针算法”快速找到两个的和等于-a即可。
处理细节问题:
1、去重
- 找到一种结果之后,left和right指针要跳过重复元素
- 当使用完一次双指针算法之后,i也需要跳过重复元素
2、不漏
找到一种结果之后,不要“停”,缩小空间,继续寻找
三、原码
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;//1、排序sort(nums.begin(),nums.end());//2、利用双指针解决for(int i = 0;i<nums.size();){int left = i+1;int right = nums.size()-1;int target = -nums[i];while(left < right){if(nums[left] + nums[right] > target)right--;else if(nums[left] + nums[right] < target)left++;else{ret.push_back({nums[i],nums[left],nums[right]});left++;right--;//去重left和rightwhile(left<right && nums[left] == nums[left-1]) left++;while(left<right && nums[right] == nums[right+1]) right--;}}//去重ii++;while(i<nums.size() && nums[i] == nums[i-1]) i++;}return ret;}
};