您的位置:首页 > 其它

leetcode-15 3Sum

2015-04-22 15:37 561 查看
a+b+c=0可以看做a+b=-c。利用twoSum的方法。

class Solution {
public:
//想法是,首先采用快排进行排序,
//然后利用twoSum的方法,将-c当做target即可。
void quick_sort( vector<int> &s, int left, int right)//快排,首先排序
{
if(left < right)
{
swap(s[left], s[(left + right)/2]);//将第一个数与中间的数交换,尽量取得中位数
int i= left, j= right;
vector<int> x{ s[i] };
while( i < j)
{
while( x[0] <= s[j] && i < j)// 找到最右边第一个小于X的数
--j;
if( i < j)
s[i++] = s[j];
while( x[0] > s[i] && i < j)//找到最左边第一个大于X的数
++i;
if(i < j)
s[j--] = s[i];
}
s[i] = x[0];
quick_sort(  s,  left,  i-1); //递归调用快排,排前半段
quick_sort(  s,  i+1,  right); //递归调用快排,排后半段
}
}
//twoSum()
void twoSum( vector<int> &temp, vector<vector<int> > &solu, int targetDex)
{
int i= targetDex + 1, j = temp.size()-1;
//vector<int> v;
while( i < j)
{
if(temp[targetDex] + temp[i] + temp[j] > 0)
--j;
else if(temp[targetDex] + temp[i] + temp[j] < 0)
++i;
else
{
vector<int> v;
v.push_back(temp[targetDex]);
v.push_back(temp[i]);
v.push_back(temp[j]);
solu.push_back(v);
++i;
--j;
while(i < temp.size() && temp[i]==temp[i - 1]) i++;
while(j >= 0 && temp[j] == temp[j + 1]) j--;
}
}
}

vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > solution;
int countS=0;
int left = 0, right = num.size() - 1;
quick_sort( num , left, right);//快排

//利用two sum 的办法,将a+b+c = 0 看做 a+b = -c,
for(int i=0; i < num.size(); ++i)
{
if( i > 0 && num[i] == num[i-1] || num[i] > 0)
continue;
twoSum( num, solution, i);
}
return solution;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: