该题要求如下:
Given an array S of n integers, are there elements a, b, c 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)本题思路很直接,上代码:
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>> retVal;
int n = num.size();
sort(num.begin(), num.end());
for (int i = 0; i < n; ++i) {
while (i > 0 && num[i] == num[i-1])
++i;
int low = i + 1;
int high = n - 1;
while (low < high) {
if (num[low] + num[high] + num[i] == 0) {
vector<int> triplets;
triplets.push_back(num[i]);
triplets.push_back(num[low]);
triplets.push_back(num[high]);
retVal.push_back(triplets);
do {
++low;
} while (num[low-1] == num[low]);
do {
--high;
} while (num[high+1] == num[high]);
}
else if (num[low] + num[high] + num[i] < 0) {
do {
++low;
} while (num[low-1] == num[low]);
}
else {
do {
--high;
} while (num[high+1] == num[high]);
}
}
}
return retVal;
}
};
代码量不小,但步骤很简单:
1,首先要把sum排序一下,
2,然后有一个for循环,是外层循环,是每个triplets里面最小的元素
3,进入循环后,再进入一个内层循环,设两个值,low设为i+1,high设为最大元素,看看这两个元素加上之前外层循环的元素是否等于0,如果等于0,则插入该triplets,如果大于,则把high往前移动一位,反之则把low向后移动以为,相等时跳出。。
4,注意:外层循环的i还是low,high,无论哪个移动后对应值不变的话,则继续移动,知道找到不同值为止