题目链接:https://leetcode.com/problems/3sum/description/
题目介绍:给出一串数组,找出所有和等于零的三个数,输出结果不重复。
解题思路:首先,先对数组进行从小到大排序。然后可以直接枚举所有情况(复杂度为n的三次方),不过还有更优化的算法,就是将后面2个数的枚举变成一次遍历。通过比较三个数的和与零的大小,若比零大则说明需要往小的数选,若比零小则说明需要往大的数选,若跟零相等则就是要找的三个数。我首先将找到的三个数保存到SET,确保不会有重复的单元,然后再拷贝到VECTOR进行输出。
代码如下:
vector<vector<int>> threeSum(vector<int>& nums) {
if (nums.size() < 3) {
vector<vector<int>> output;
return output;
}
sort(nums.begin(), nums.end());
set<vector<int>> result;
for (int i = 0; i < nums.size()-2; i++) {
int j = i + 1, k = nums.size() - 1;
while (j < k) {
if (nums[i] + nums[j] + nums[k] == 0) {
vector<int> tmp;
tmp.push_back(nums[i]);
tmp.push_back(nums[j]);
tmp.push_back(nums[k]);
result.insert(tmp);
j++;
k--;
}
else if (nums[i] + nums[j] + nums[k] < 0) {
j++;
}
else if (nums[i] + nums[j] + nums[k] > 0) {
k--;
}
}
}
vector<vector<int>> output(result.size());
copy(result.begin(), result.end(), output.begin());
return output;
}