本题可转化成2Sum问题,但不同的是需要注意有可能有多值,需要在添加过程中去掉重复的元素。代码如下:
1 class Solution 2 { 3 public: 4 vector<vector<int> > threeSum(vector<int> &num) 5 { 6 vector<vector<int> > res; 7 sort(num.begin(), num.end()); 8 for (int i = 0; i < num.size(); i++) 9 { 10 int target = -num[i]; 11 int front = i + 1; 12 int back = num.size() - 1; 13 while (front < back) 14 { 15 int sum = num[front] + num[back]; 16 // 由两侧向中间查找target 17 if (sum < target) 18 front++; 19 else if (sum > target) 20 back--; 21 else 22 { 23 vector<int> triplet(3, 0); 24 triplet[0] = num[i]; 25 triplet[1] = num[front]; 26 triplet[2] = num[back]; 27 res.push_back(triplet); 28 //找到下一个不同的num[front] 29 while (front < back && num[front] == triplet[1]) front++; 30 //找到下一个不同的num[back] 31 while (front < back && num[back] == triplet[2]) back--; 32 } 33 } 34 //找到下一个不同的num[i] 35 while (i + 1 < num.size() && num[i + 1] == num[i]) 36 i++; 37 } 38 return res; 39 } 40 };