题目链接:
题目描述:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
算法:
我们发现这道题目与之前的题目1. 两数之和有异曲同工之妙。本质上是把target换成了-a罢了。因此可以考虑用之前题目的方法去解这道题。
对于方法一:暴力破解法。在这里算法复杂度为。已经超时了。
对于方法二:这里我们先做一遍排序,然后遍历一遍数组,并找到第k个元素后面相加等于-k的元素。总的时间复杂度为。
对于方法三:这里显然在用了hash表记录-k之后,还需要两重遍历,时间复杂度为,同时,空间复杂度为。
就这道题来说,显然方法二更好。
代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
// 去重
while (i != 0 && i < nums.size() && nums[i - 1] == nums[i])
i++;
int j = i + 1, k = nums.size() - 1;
while (j < k) {
if (nums[j] + nums[k] + nums[i] < 0) {
j++;
} else if (nums[j] + nums[k] + nums[i] > 0) {
k--;
} else {
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
// 去重
if (result.empty() || temp != result.back())
result.push_back(temp);
j++;
}
}
}
return result;
}
};