【leetcode】三数之和【C++】
题目如下:
解题思路:
先将数组排序,之后问题就将三个数的问题转化为两数之和的问题:a+b+c=sum => a+b=sum-c 。
代码如下:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums){
int sum = 0;
vector<vector<int>> res;
vector<int> temp;
//先将数组排序(升序)
sort(nums.begin(), nums.end());
//将三个数的问题转化为两个数的和:a+b+c=sum => a+b=sum-c,下面的循环中:left+right=sum-base
for(int base = 0; base < nums.size(); base++)
{
//跳过相同元素
if(base > 0 && nums.at(base) == nums.at(base-1))
continue;
//base大于等于0时,不存在相加为0的结果集
if(nums.at(base) > 0)
break;
//头尾两个指针进行扫描,因为数组已排序,可以从base后面扫描,避免重复组合
int left = base + 1;
int right = nums.size() - 1;
while(left < right)
{
//若left+right>sum-base,则应减小,right左移
if(nums.at(left) + nums.at(right) > sum - nums.at(base))
right--;
//若left+right<sum-base,则应减小,left右移
else if(nums.at(left) + nums.at(right) < sum - nums.at(base))
left++;
//相等情况下得到一组解
else{
temp.clear();
temp.push_back(nums.at(base));
temp.push_back(nums.at(left));
temp.push_back(nums.at(right));
res.push_back(temp);
// 如果 left 和 left+1 相同,则略过,避免出现重复组合
while (left < right && nums.at(left) == nums.at(left + 1))
++left;
// 如果 right 和 right-1 相同,则略过,避免出现重复组合
while (left < right && nums.at(right) == nums.at(right - 1))
--right;
// 处理下一对数
++left;
--right;
}
}
}
return res;
}
};