真是只要思路清晰,代码清晰,题目就会容易做。
给定数组,找出所有相加得0的三个数组合,重复的不要,每一组按从小到大的顺序。
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>> res;
sort(num.begin(), num.end());
int i,j,k,n = num.size();
int leftside = n,rightside = n-1;
for(i = 0; i < n; i++){
if(num[i]>=0 && leftside > i)leftside = i;
if(num[i]>0){rightside = i-1;break;}
}
if (rightside < 0 || leftside > n-1)
{
return res;
}
if(rightside - leftside >1){
vector<int> tmp;
tmp.push_back(0);tmp.push_back(0);tmp.push_back(0);
res.push_back(tmp);
}
//
for(i=0; i<leftside; i++){
for(j = n-1; j > rightside;j--){
int sumj = num[i] + num[j], sumk;
if(sumj == 0){
if(num[leftside] == 0){
vector<int> tmp;
tmp.push_back(num[i]);tmp.push_back(0);tmp.push_back(num[j]);
res.push_back(tmp);
}
}else if(sumj > 0){
for(k = i+1;k < leftside;k++){
if(sumj + num[k] == 0){
vector<int> tmp;
tmp.push_back(num[i]);tmp.push_back(num[k]);tmp.push_back(num[j]);
res.push_back(tmp);
break;
}else if(sumj + num[k] > 0){
break;
}
}
}else if(sumj < 0){
for(k = j-1; k > rightside;k--){
if(sumj + num[k] == 0){
vector<int> tmp;
tmp.push_back(num[i]);tmp.push_back(num[k]);tmp.push_back(num[j]);
res.push_back(tmp);
break;
}else if(sumj + num[k] < 0){
break;
}
}
}
while(j > rightside && num[j] == num[j-1])j--;
}
while(i < leftside && num[i] == num[i+1])i++;
}
return res;
}
};
leetcode上标记的最优解也是差不多,反而是我的代码比较容易理解。
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
typedef vector<int> numbers;
vector<numbers> result;
sort(num.begin(), num.end());
for (int x = num.size()-1; x >=2; x--) { // Do it backwards
if(x < num.size()-1 & num[x] == num[x+1]) continue; // Skip same x
for (int y = 0, z = x-1; y < z;) {
if(y>0 && num[y]==num[y-1]) { // Skip same y
y++;
continue;
}
if(z<x-1&&num[z]==num[z+1]) { // Skip same z
z--;
continue;
}
int s = num[x] + num[y] + num[z];
if (s > 0)
z--;
if (s < 0)
y++;
if (s == 0) {
vector<int> tmpOne(3);
tmpOne[0] = num[y];
tmpOne[1] = num[z];
tmpOne[2] = num[x];
result.push_back(tmpOne);
y++;z--;
}
}
}
return result;
}
};