给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解题思路:三数之和可以解构成在二数之和问题的基础上,将target的值变成变化的值。将数组遍历,每个元素的值就是target的取值。
1.为保证不重复,首先对数组进行排序,但不可去重,。当target取值相同时,直接跳过 即可,这是保证不重复需要注意的其中一点,另一点,在寻找两数之和满足target时,若遇到相同的元素,(相同元素必定相邻)直接跳过。
2.数组小于3 直接返回。
3.第一个元素大于0或者最后一个元素小于0 直接返回。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());
// 数组不够3个元素,最小元素大于0或者最大元素小于0 直接返回
if(nums.size() < 3 || nums[0] > 0 || nums[nums.size() - 1] < 0) return result;
for(int i = 0; i < nums.size(); ++i){
if(nums[i] > 0) break;
if(i > 0 && nums[i] == nums[i -1]) continue;
int target = 0 - nums[i];
int left = i + 1;
int right = nums.size() - 1;
while(left < right){ // 去重
if(nums[left] > target) break;
if(left > i + 1 && nums[left] == nums[left - 1] || nums[left] + nums[right] < target){
++left;
}
else if(right < nums.size() - 1 && nums[right] == nums[right + 1] || nums[left] + nums[right] > target){
--right;
}
else{
vector<int> res;
res.push_back(nums[i]);
res.push_back(nums[left]);
res.push_back(nums[right]);
result.push_back(res);
++left;
}
}
}
return result;
}
};