代码改变世界

3Sum

2015-03-30 16:10  笨笨的老兔子  阅读(140)  评论(0编辑  收藏  举报

给定一个数组,如果存在三个数的和为0,求这三个数a、b、c,并使得a<=b<=c, 不得有重复出现

思路:和2SUM一样,先排序,然后取出一个数,作为2SUM的target,进行查找。
注意点:不得有重复,需要每次得到一个结果以后进行首尾去重

  1. class Solution {
  2. public:
  3. vector<vector<int> > threeSum(vector<int> &num) {
  4. vector<vector<int> >res;
  5. if (num.size() <3)
  6. {
  7. return res;
  8. }
  9. sort(num.begin(), num.end());
  10. int target = 0, head = 0, tail = 0;
  11. for (size_t i = 0; i < num.size()-1; i++)
  12. {
  13. if (i > 0 && num[i - 1] == num[i])
  14. continue;
  15. target = num[i] * (-1);
  16. for (head=i+1,tail = num.size()-1; head < tail;)
  17. {
  18. if (num[head]+num[tail] > target)
  19. {
  20. tail--; continue;
  21. }
  22. if (num[head] + num[tail] < target)
  23. {
  24. head++; continue;
  25. }
  26. if (num[head] + num[tail] == target)
  27. {
  28. vector<int> subRes;
  29. subRes.push_back(num[i]);
  30. subRes.push_back(num[head]);
  31. subRes.push_back(num[tail]);
  32. res.push_back(subRes);
  33. while (head<tail && num[head] == num[head + 1])
  34. {
  35. head++;
  36. }
  37. while (head<tail && num[tail] == num[tail - 1])
  38. {
  39. tail--;
  40. }
  41. head++;
  42. }
  43. }
  44. }
  45. return res;
  46. }
  47. };