我的心愿是世界和平!
题目描述:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c,使得 a + b + c = 0?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
example:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]。
题目在这里~ ~ ~ ~ ~ ~ ~
1、对数组中的元素按从小到大排序。
2、当 nums[i] <= 0 时,用 left 和 right 指针确定三个元素,若三元素之和等于0,则符合条件;若三元素之和大于0,则 right-- ;若三元素之和小于0,则 left++。
3、判断三元组是否重复:在一个 nums[i] 中,若 nums[left] || nums[right] 出现过,则已添加过。 若 nums[i] 出现过,则不必再次查找。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> >vv;
vector<int>v;
if(nums.size()==0) return vv;//数组元素为0 个
sort(nums.begin(),nums.end());//排序
int i,left,right,len=nums.size(),t=nums[0]-1,flag;
for(i=0;i<len;i++){
if(nums[i]>0) break;//排序原因,等于0的条件不会再成立
if(nums[i]==t) continue;//与前一个 nums[i] 相同,不必再次查找
v.push_back(nums[i]);
left=min(i+1,len-1);//避免 i+1 超出边界
right=len-1;
flag=nums[i]-1;
while(left<right){
if(nums[i]+nums[left]+nums[right]==0){
if(nums[left]!=flag){
v.push_back(nums[left]);
v.push_back(nums[right]);
vv.push_back(v);
v.pop_back();
v.pop_back();
flag=nums[left];
}
left++;
right--;
}else if(nums[i]+nums[left]+nums[right]<0){
left++;
}else if(nums[i]+nums[left]+nums[right]>0){
right--;
}
}
v.pop_back();
t=nums[i];
}
return vv;
}
};