码迷,mamicode.com
首页 > 其他好文 > 详细

3Sum

时间:2015-03-30 18:26:17      阅读:115      评论:0      收藏: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. };




3Sum

标签:

原文地址:http://www.cnblogs.com/flyjameschen/p/4378347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!