您的位置:首页 > 其它

LeetCode-15-3Sum(证明/KSum)-Medium

2015-12-26 12:20 357 查看
题目理解:

求解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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: