题目地址:
https://leetcode.com/problems/3sum/
给定一个数组,要求返回其中的所有的和为 0 0 0的三元集,要求不允许有重复。
找和为 0 0 0的三个数是很容易的,只需要先排序,然后固定第一个数,接下来对剩余的数做对撞双指针即可。关键在于怎么避免重复。想法是,只要看到某个数和其之前的数相等,就略过,直到走到新的数再去判断其和。具体代码如下:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& a) {
sort(a.begin(), a.end());
vector<vector<int>> res;
int n = a.size();
for (int i = 0; i + 2 < n; i++) {
int j = i + 1, k = n - 1;
while (j < k) {
if (a[j] + a[k] < -a[i]) j++;
else if (a[j] + a[k] > -a[i]) k--;
else {
res.push_back({a[i], a[j], a[k]});
while (j < k && a[j] == a[j + 1]) j++;
j++;
while (j < k && a[k] == a[k - 1]) k--;
k--;
}
}
while (i + 2 < n && a[i] == a[i + 1]) i++;
}
return res;
}
};
时间复杂度 O ( n 2 ) O(n^2) O(n2),空间 O ( 1 ) O(1) O(1)。