15.三数之和
给你一个包含 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]]
示例 2:
输入:nums = []
输出:[]
先将数组排序,固定一个数,将另两个数看为两数之和进行操作(使用双向指针)
class Solution {public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());vector<vector<int>> result;int n = nums.size();for(int i=0;i<n;i++){//如果第一个数都>0直接返回if(nums[i]>0)break;//去重,从第二个数开始,若当前数与前一个数相同,则跳过if(i>0 && nums[i]==nums[i-1])continue;//双指针int left = i+1;int right = n-1;while(left<right){if(left>=right)break;//若满足条件,则记录数据,并将指针收缩范围if(nums[i]+nums[left]+nums[right]==0){result.push_back(vector<int>{nums[i],nums[left],nums[right]});left++;right--;//去重,若出现重复的数字就继续收缩while(left<right && nums[left] == nums[left-1])left++;while(left<right && nums[right] == nums[right+1])right--;}else if(nums[i]+nums[left]+nums[right]>0)right--;elseleft++;}}return result;}};
