题目:
给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
思路:
这道题第一反应就是三个for循环再去重。很显然,这样做效率太低,时间复杂度太高。
那么,仔细看这道题, a + b + c = 0 => b+ c = -a
我们可以采用双指针的方法。将a作为第一个循环参数,双指针分别指向的是 b、c。通过判断 a 与 b、c 之间的大小来移动双指针。当然,最重要的前提,我们需要将该数组进行排序,这样,我们才能正确的找到满足要求的组合。
期间,遇到相同的元素,则跳过。
程序:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> res;
vector<int> tmp;
if (nums.size() < 3)
return res;
int i = 0,j,k,val;
int len = nums.size();
while (i < len-2){
j = i + 1;
k = nums.size() - 1;
val = -nums.at(i);
while (j < k){
if (nums[j]+nums[k] == val){
tmp.emplace_back(nums.at(i));
tmp.emplace_back(nums.at(j));
tmp.emplace_back(nums.at(k));
res.emplace_back(tmp);
tmp.clear();
j++;
k--;
while (nums[j] == nums[j-1] && j < k){
j++;
}
while (nums[k] == nums[k+1] && j < k){
k--;
}
}
else if (nums[j]+nums[k] < val){
j++;
}
else{
k--;
}
}
i++;
while (nums[i] == nums[i-1]){
i++;
}
}
return res;
}
};