题目理解:
求解vector中三个数(a,b,c)之和为0,其中,a、b、c不能为重复值,并且按照a<b<c的规则进行排列;
解题分析:
1. 典型的KSum题目;
1)先排序;
2)首尾两端两个指针同时向对端移动;
3)过程中避免重复的结果;
题目的关键是证明两个指针向对端移动的过程中,不会漏掉有效的取值(可以使用反正法进行证明);
解题代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
int size=nums.size();
if(size<3){
return ans;
}
sort(nums.begin(),nums.end());
int pre=1;//the first element can not greater than 0
for(int i=0;i<size-2;i++){
if(nums[i]==pre){
continue;
}else{
pre=nums[i];
}
int left=i+1;
int right=size-1;
int preLeft, preRight;
bool isInitLR=false;
while(left<right){
int sum=nums[i]+nums[left]+nums[right];
if(sum>0){
right--;
}else if(sum<0){
left++;
}else{
if(!isInitLR){
isInitLR=true;
}else{
if(nums[left]==preLeft){
left++;
continue;
}
if(nums[right]==preRight){
right--;
continue;
}
}
vector<int> t;
t.push_back(nums[i]);
t.push_back(nums[left]);
t.push_back(nums[right]);
ans.push_back(t);
preLeft=nums[left];
preRight=nums[right];
left++;
right--;
//cout<<"ans.push_back()"<<endl;
}
//cout<<"left= "<<left<<endl;
//cout<<"right= "<<right<<endl;
}
}
return ans;
}
};