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; } };
相关文章推荐
- [Leetcode] 15. 3Sum 解题报告
- Leetcode 15 3Sum + 有趣的小BUG
- [leetcode] 15. 3Sum 解题报告
- leetcode 15 : 3sum
- Sum—LeetCode-15 3Sum
- LeetCode 15 — 3Sum(C++ Java Python)
- LeetCode - 15 - 3Sum(内有two sum)
- LeetCode 15 3Sum
- LeetCode-15:3Sum
- [Leetcode] 15. 3Sum
- leetcode15~3Sum
- The Solution to LeetCode 15 3Sum改进版
- [LeetCode] 15. 3Sum
- [LeetCode] 15. 3Sum
- [LeetCode] 15. 3Sum ☆☆
- Leetcode 15 3Sum
- LeetCode15——3Sum
- LeetCode 15 3Sum
- leetcode 15 3Sum
- 【leetcode】【15】3Sum