您的位置:首页 > 其它

leetcode15 3Sum

2015-10-22 23:37 375 查看
题意就是给定一组数,任意选取三个数,每个数只能选取一次,找到所有三个数为0的组合,其实找到所有组合还是比较简单的,先固定一个数,之后两个数因为是在一个序列上选取,定义两个指针一个指向头一个指向尾,根据三个数的和是否大于0来决定往前走还是往后走,这样就简化成n^2的效率.

难点在去重上,先是用了vector的去重结果超时了.

之后就想重复的数一定就是产生重复序列的罪魁祸首,之后就利用三个while循环,略过所有一样的数,调了几次,果断ok了.还是逻辑上想的不够多,导致总是缺项,加强逻辑缜密性啊.

#include "iostream"
#include "vector"
#include "algorithm"
#include "string"
using namespace std;

class Solution {
public:
vector<vector<int> > threeSum(vector<int>& nums) {
int len = nums.size();
int right,left;
sort(nums.begin(),nums.end());

vector<vector<int> > result;

if(len < 3)
return result;

for(int i = 0 ; i < nums.size()-2; i++)
//cout<<"("<<nums[i]<<")\n";
{
if(nums[i]>0)
break;

if(i!=0)
{
if(nums[i] == nums[i-1])
continue;
}

//cout<<"("<<result.size()<<")"<<endl;
//-2 0 1 1 2
right = i+1;
left = nums.size()-1;

for(;right<left;)
{
if(nums[i]+nums[right]+nums[left] == 0)
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[right]);
temp.push_back(nums[left]);
result.push_back(temp);
}
if(nums[i]>0)
break;

if(nums[i]+nums[right]+nums[left] > 0)
{
left--;
while(nums[left] == nums[left+1])
left--;
}
else
{
right++;
while(nums[right] == nums[right-1])
right++;
}
}

}
//sort(result.begin(), result.end());
//vector<vector<int> >::iterator last2;
//last2 = unique(result.begin(),result.end());
//result.erase(last2, result.end());

return result;

}
};

int main()
{
Solution test;

vector<int> num;

num.push_back(1);
num.push_back(1);
num.push_back(-2);
num.push_back(0);
num.push_back(2);
//num.push_back(0);

vector<vector<int> > result;

result = test.threeSum(num);

for(int i = 0 ; i < result.size(); i++)
{
cout<<i<<endl;
for(int j = 0 ; j < result[i].size(); j++)
{
cout<<"<"<<result[i][j]<<">"<<endl;
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: