1.超时简单版本。先排序,根据第一个数和第二个数的变化情况来进行筛选。当数组很长时超时
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> ret;
int lasti=-1;
int lastj=-1;
int lastk=-1;
int set = 0;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
for(int k = j+1;k<nums.size();k++){
if(nums[i]+nums[j]+nums[k]==0){
vector<int> t;
if(set && lasti == nums[i] &&lastj >= nums[j]){
continue;
}
lasti = nums[i];
lastj = nums[j];
lastk = nums[k];
set = 1;
t.push_back(nums[i]);
t.push_back(nums[j]);
t.push_back(nums[k]);
ret.push_back(t);
}
}
}
}
return ret;
}
};
2.改进版,用map进行元素个数缓存,根据1同样的去重规则,AC,但是速度仍然有优化空间
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> ret;
map<int,int> m;
map<int,int>::iterator iter;
for(int i=0;i<nums.size();i++){
m[nums[i]] = 0;
}
for(int i=0;i<nums.size();i++){
m[nums[i]] += 1;
}
int lasti=-1;
int lastj=-1;
int lastk=-1;
int set = 0;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
if(-(nums[i]+nums[j])<nums[j]){
continue;
}
iter = m.find(-(nums[i]+nums[j]));
if(set && nums[i]==lasti && nums[j]<=lastj){
continue;
}
if(iter!=m.end() && (iter->first)!=nums[i] && (iter->first) !=nums[j] || iter!=m.end() && m[iter->first]>1 && (nums[i]!=0 ||nums[j]!=0) || iter!=m.end() && (nums[i]==0 && nums[j]==0 && m[0]>=3)){
vector<int> t;
t.push_back(nums[i]);
t.push_back(nums[j]);
t.push_back(-nums[i]-nums[j]);
ret.push_back(t);
lasti=nums[i];
lastj=nums[j];
lastk=-nums[i]-nums[j];
set = 1;
}
}
}
return ret;
}
};