重点:
1 ,双向指针
2 解集去重
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
if(nums.size()==0) return res;
set<int> s;
for(int i=0;i<nums.size();i++){
s.insert(nums[i]);
}
vector<int> num;
set<int>::iterator ite1 = s.begin();
set<int>::iterator ite2 = s.end();
for(;ite1!=ite2;ite1++)
{
cout<<*ite1<< " ";
num.push_back(*ite1);
}
for(int i=0; i<num.size()-2;i++){
for(int j=i+1;j<num.size()-1;j++){
for(int k=j+1; k<num.size();k++){
if(nums[i]+num[j]+num[k]==0){
vector<int> temp;
temp.push_back(num[i]);
temp.push_back(num[j]);
temp.push_back(num[k]);
res.push_back(temp);
}
}
}
}
return res;
}
vector<vector<int>> threeSum2(vector<int>& num) {
vector<vector<int>> res;
int numSize=num.size();
if(numSize<=2)
return res;
sort(num.begin(),num.end());
for(int i=0; i<numSize-2; i++){
cout<< num[i]<< " ";
int now=num[i];
if(now > 0) break;
int left=i+1;
int right=numSize-1;
int nenow=0-now;
while (left < right){
int intleft=num[left];
int intright=num[right];
if(intleft+intright == nenow){
vector<int> temp={now,intleft,intright};
res.push_back(temp);
while(left < right && num[left]==intleft){
left++;
}
while (right > left && num[right]==intright){
right--;
}
}else if(intleft+intright < nenow){
left++;
} else if(intleft+intright > nenow)
right--;
}
while (i+1 < numSize-2 && num[i]==num[i+1]){
i++;
}
}
return res;
}
};
int main() {
std::cout << "Hello, World!" << std::endl;
vector<int> num={-1, 0, 1, 2, -1, -4};
Solution p;
p.threeSum2(num);
return 0;
}