leetcode15. 3Sum
思路:
1.利用2sum的方法直接套上,这里就不讨论;
2.使用正负0三个map,分情况讨论。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
map<int,vector<int>*> positive;
map<int,vector<int>*> zero;
map<int,vector<int>*> negative;
vector<vector<int>> result;
vector<int> intVector;
int tempArr[3];
//初始化正负0三个数组,采用map是降低查找时间
for(vector<int>::iterator iter = nums.begin();iter!=nums.end();iter++){
if(*iter>0){
if(!positive.count(*iter))
{
positive[*iter] = new vector<int>();
}
positive[*iter]->push_back(iter - nums.begin());
}else if(*iter<0 && (*iter)>INT_MIN){
if(!negative.count(*iter))
{
negative[*iter] = new vector<int>();
}
negative[*iter]->push_back(iter - nums.begin());
}else{
if(!zero.count(*iter))
{
zero[*iter] = new vector<int>();
}
zero[*iter]->push_back(iter - nums.begin());
}
}
intVector.push_back(0);
intVector.push_back(0);
intVector.push_back(0);
if(zero.count(0) && zero[0]->size()>=3) result.push_back(intVector);
intVector.clear();
if(positive.size()>=1 && negative.size()>=1){
for(map<int,vector<int>*>::iterator iterNegative = negative.begin();iterNegative!=negative.end();iterNegative++){
for(map<int,vector<int>*>::iterator iterPositive = positive.begin();iterPositive!=positive.end();iterPositive++){
if(iterNegative->first + iterPositive->first >0 ){
map<int,vector<int>*>::iterator tempIter = negative.find(0-iterNegative->first-iterPositive->first);
if(tempIter != negative.end()){
if((tempIter==iterNegative && iterNegative->second->size()>=2) || (tempIter!=iterNegative && (tempIter->second)[0] < (iterNegative->second)[0] )){
intVector.push_back(iterNegative->first);
intVector.push_back(tempIter->first);
intVector.push_back(iterPositive->first);
sort(intVector.begin(),intVector.end());
result.push_back(intVector);
intVector.clear();
}
}
}else if(iterNegative->first + iterPositive->first == 0 ){
//有一个0的情况
if(zero.count(0) && zero[0]->size()>=1){
intVector.push_back(iterNegative->first);
intVector.push_back(0);
intVector.push_back(iterPositive->first);
sort(intVector.begin(),intVector.end());
result.push_back(intVector);
intVector.clear();
}
}else{
map<int,vector<int>*>::iterator tempIter = positive.find(0-iterNegative->first-iterPositive->first);
if(tempIter != positive.end() ){
if((tempIter==iterPositive && iterPositive->second->size()>=2) || (tempIter!=iterPositive && (tempIter->second)[0] < (iterPositive->second)[0] )){
intVector.push_back(iterNegative->first);
intVector.push_back(tempIter->first);
intVector.push_back(iterPositive->first);
sort(intVector.begin(),intVector.end());
result.push_back(intVector);
intVector.clear();
}
}
}
}
}
}
return result;
}
};