力扣:15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
双指针
先排序,然后在用左和右位置的两个数相加,其值与最低位的比较
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> ans;
if (nums.size() < 3) {
return ans;
}
for (int i = 0; i < nums.size() - 2; ++i) {
int l = i + 1, r = nums.size() - 1;
if (nums[i] > 0) {
break;
}
while (l < r) {
if (nums[l] + nums[r] == -nums[i]) { //相等
ans.push_back({ nums[i],nums[l],nums[r] });
while (l < r && nums[l] == nums[l + 1]) {
l++;
}
while (l < r && nums[r] == nums[r - 1]) {
r--;
}
++l;
--r;
}
else if (nums[i] + nums[l] + nums[r] > 0) { //右侧值太大
--r;
}
else { //左侧值太小
++l;
}
}
while (i + 1 < nums.size() && nums[i] == nums[i + 1]) { //下一个成员
++i;
}
}
return ans;
}
};
int main()
{
Solution solution;
vector<int> threesum = { -1,0,1,2,-1,-4 };
vector<vector<int>> result;
result = solution.threeSum(threesum);
for (const auto& triplet : result) {
for (int num : triplet) {
cout << num << " ";
}
cout << endl;
}
return 0;
}