题目链接:​​https://leetcode-cn.com/problems/3sum/​

LeetCode——15. 三数之和(C++)_C++

#include <bits/stdc++.h>
using namespace std;

/*
努力优化后的 排序+for循环,结果依旧逃不过超时的厄运
*/
//class Solution
//{
// public:
// vector<vector<int>> threeSum(vector<int>& nums)
// {
// sort(nums.begin(), nums.end());
// vector<vector<int>> res;
// int len = nums.size();
// for(int i = 0; i < len - 2; i++)
// {
// if(nums[i] > 0) break;
// if(nums[i] * 2 > 0) break;
// if(nums[i] * 3 > 0) break;
// if(i != 0 && nums[i - 1] == nums[i]) continue; // i 变化之后,位置上的值未变,则继续变 i
// for(int j = i + 1; j < len - 1; j++)
// {
// if(nums[i] + nums[j] > 0) break;
// if(nums[i] + nums[j] * 2 > 0) break;
// if(j != i + 1 && nums[j - 1] == nums[j]) continue; // 在 i 不变的情况下,如果 j 位置的值也没有变,则没必要进一步进行
// int flag = 0 - nums[i] - nums[j];
// for(int k = j + 1; k < len; k++)
// {
// if(k != j + 1 && nums[k - 1] == nums[k]) continue; // k 变化之后,位置上的值未变,则继续变 k
// if(nums[k] > flag) break;
// if(nums[k] == flag)
// {
// vector<int> v = {nums[i], nums[j], nums[k]};
// res.push_back(v);
// break;
// }
// }
// }
// }
// return res;
// }
//};

/*
优化版:排序+双指针
*/
class Solution
{
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> res;
int len = nums.size();
if(len < 3) return res;
sort(nums.begin(), nums.end());
for(int i = 0; i < len - 2; i++)
{
if(nums[i] > 0) return res;
int l = i + 1;
int r = len - 1;
while(l < r)
{
// 网友提供的思路,要考虑溢出
long long x = static_cast<long long>(nums[i]);
long long y = static_cast<long long>(nums[l]);
long long z = static_cast<long long>(nums[r]);

if(x + y + z > 0) r--;
else if(x + y + z < 0) l++;
else if(x + y + z == 0)
{
vector<int> v = {nums[i], nums[l], nums[r]};
res.push_back(v);
while(l < r && nums[l] == nums[l + 1]) l++;
while(l < r && nums[r] == nums[r - 1]) r--;
l++;
r--;
}
}
while(i + 1 < len - 2 && nums[i] == nums[i + 1]) i++;
}
return res;
}
};

int main()
{
Solution sol;
// vector<int> v0 = {-1, 0, 1, 2, -1, -4};
// vector<int> v0 = {0,0,0,0};
// vector<int> v0 = {0,0,0};
vector<int> v0 = {-4,-1,-4,0,2,-2,-4,-3,2,-3,2,3,3,-4};
vector<vector<int>> res = sol.threeSum(v0);
for(int i = 0; i < res.size(); i++)
{
for(int j = 0; j < 3; j++)
{
cout<<res[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
return 0;
}