15. 三数之和
2020-06-13 本文已影响0人
geaus
题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解题思路
排序+双指针。
first元素从下标0开始遍历,second、third元素则分别从first+1和n-1往中间靠拢。需要注意,由于不能有重复的三元组,所以first>0时,需要检查first和first-1的值是否相等,若相等则first++,同理second和third也是。
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> ret;
if(nums.size()<3)
return ret;
// [-2,-1,0,1,2,3]
for(int first=0; first<nums.size()-2; first++){
if(first>0 && nums[first]==nums[first-1])
continue;
int second = first+1;
int third = nums.size()-1;
int target = -nums[first];
while(second<third){
if(nums[second]+nums[third]==target){
ret.push_back(vector<int>{nums[first], nums[second], nums[third]});
second++;
third--;
while(second<third && nums[second]==nums[second-1])
second++;
while(second<third && nums[third]==nums[third+1])
third--;
}else if(nums[second]+nums[third]>target){
third--;
}else{
second++;
}
}
}
return ret;
}