给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
注意事项
在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组。
样例
如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:
(-1, 0, 1)
(-1, -1, 2)
class Solution {
public:
/**
* @param numbers : Give an array numbers of n integer
* @return : Find all unique triplets in the array which gives the sum of zero.
*/
void my_sort(vector<int> &temp,int num1,int num2,int num3){
temp.push_back(num1);
temp.push_back(num2);
temp.push_back(num3);
for(int i=0;i<2;i++){
for(int j=0;j<2-i;j++){
if(temp[j]>temp[j+1]){
int tem=temp[j];
temp[j]=temp[j+1];
temp[j+1]=tem;
}
}
}
}
vector<vector<int> > threeSum(vector<int> &nums) {
// write your code here
vector<vector<int> > result;
vector<int> temp;
if(nums.empty())
return result;
map<int,int> my_map;
int num1,num2,num3;
// map<int,int>::iterator it;
// it=my_map.end();
for(int i=0;i<nums.size();i++){
if(my_map.find(nums[i])==my_map.end())
my_map[nums[i]]=1;
else
my_map[nums[i]]++;
}
for(int i=0;i<nums.size()-1;i++){
my_map[nums[i]]--;
for(int j=i+1;j<nums.size();j++){
my_map[nums[j]]--;
int flag=0;
if(my_map[-nums[i]-nums[j]]>0){
my_sort(temp,nums[i],nums[j],-nums[i]-nums[j]);
for(int k=0;k<result.size();k++){
for(int l=0;l<3;l++){
if(temp[l]==result[k][l]){
flag++;
}
}
if(flag==3)
break;
else
flag=0;
}
if(flag!=3)
result.push_back(temp);
temp.clear();
}
my_map[nums[j]]++;
}
my_map[nums[i]]++;
}
return result;
}
};
如有问题请留言。
如有帮助请顶一个,你们的支持是我最大的动力。
文章均可以转载,但请注明文章链接,谢谢。
本文介绍了一种高效算法,用于找出数组中三个整数相加等于零的所有不重复组合。通过排序和双指针技巧,将时间复杂度降低至O(n²)。

被折叠的 条评论
为什么被折叠?



