Chinaunix首页 | 论坛 | 博客
  • 博客访问: 338424
  • 博文数量: 45
  • 博客积分: 669
  • 博客等级: 上士
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-27 17:59
文章分类
文章存档

2015年(5)

2014年(6)

2013年(4)

2012年(30)

分类: C/C++

2015-10-21 10:34:37

LeetCode 15原题如下:

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.
 For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

   题意为:在一个数组中,寻找三个数之和为0的所有组合,要求三个数有非递减的特性,并且最后求出解集没有重复。
   此题的暴力解法即为尝试所有组合,三层for循环,并排除掉重复的解集,时间复杂度是O(n^3)。
   
由于需要求和,可以考虑先对数组排序,有序的数据肯定有利于寻找求和的数。
   排序后,按照顺序依次取出数组里面的数,然后在剩余的数中,找出两个数之和与这个数为相反数;对于有序的数组,可以排除掉相同的数据。
   这样也达到了排除重复的解集的目的。
   代码如下:

点击(此处)折叠或打开

  1. class Solution {
  2. public:

  3.     vector<vector<int>> result;
  4.     vector<vector<int>> threeSum(vector<int>& nums)
  5.     {
  6.         sort(nums.begin(), nums.end());
  7.         int len = nums.size();

  8.         for (size_t i = 0; i < nums.size(); i++)
  9.         {
  10.             if (i>0 && nums[i] == nums[i - 1])//去除重复的值//
  11.             {
  12.                 continue;
  13.             }

  14.             find(nums, i + 1, len - 1, nums[i]);

  15.         }


  16.         return result;
  17.     }

  18.     void find(vector<int> &nums, int start, int end, int target)
  19.     {
  20.         vector<int> temp(3,0);
  21.         while (start < end)
  22.         {
  23.             int sum = nums[start] + nums[end] + target;
  24.             if (sum == 0)
  25.             {
  26.                 temp[0]=target;
  27.                 temp[1]=nums[start];
  28.                 temp[2]=nums[end];

  29.                 result.push_back(temp);
  30.                 while (start < end&&nums[start] == nums[start + 1]) //跳过重复的值//
  31.                 {
  32.                     start++;
  33.                 }
  34.                 while (start < end&&nums[end] == nums[end - 1])//跳过重复的值//
  35.                 {
  36.                     end--;
  37.                 }
  38.                 start++;
  39.                 end--;
  40.             }
  41.             else if (sum < 0)
  42.             {
  43.                 start++;
  44.             }
  45.             else
  46.             {
  47.                 end--;
  48.             }
  49.         }
  50.     }
  51. };



阅读(1178) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~