给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 并找出所有满足条件且不重复的三元组。
题目使用双指针法进行求解,求解思路如下:
1.将数组进行排序
2.i从下表0开始,同时定义下标 left=i+1,right = nums.size()-1,相当于 a = nums[i] b = nums[left] c = nums[right]。
3.b+c的目标值target为0-a,所以题目转化为对每一个nums[i],找b和c,b+c = 0-nums[i]。
4.如果 nums[left] + nums[right] > target ,right应该左移;nums[left] + nums[right] < target,left应该右移;如果符合条件就加入数组中。
5.其中还需要考虑去重细节。
具体代码如下:
//三数之和
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> result;
int l = nums.size();
for (int i = 0; i<l; i++) {
if (nums[i] > 0) return result;
if (i > 0 && nums[i] == nums[i-1]) continue;
int left = i+1;
int right = l-1;
int target = 0-nums[i];
while (left < right) {
if (nums[left] + nums[right] > target) {
right --;
}
else if (nums[left] + nums[right] < target) {
left++;
}
else{
result.push_back(vector<int> {nums[i], nums[left], nums[right]});
while(left < right && nums[right] == nums[right-1]) right--;
while(left < right && nums[left] == nums[left+1]) left++;
right --;
left ++;
}
}
}
return result;
}