//三数之和
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());//数组排序
for(int i = 0; i<nums.size(); i++){
//剪枝,避免都是重复元素超时
if (i>0 && nums[i] == nums[i-1])
{
continue;
}
int start = i+1, end = nums.size()-1;
while(start<end){
int sum = nums[i] + nums[start] + nums[end];
if (sum == 0)
{
vector<int> v;
v.push_back(nums[i]);
v.push_back(nums[start]);
v.push_back(nums[end]);
result.push_back(v);
start++;
}else if (sum>0)
{
end--;
}else if (sum<0)
{
start++;
}
}
}
//对vector去重
sort(result.begin(), result.end());
result.erase(unique(result.begin(), result.end()), result.end());
return result;
}
int main()
{
vector<int> nums;
nums.push_back(-1);
nums.push_back(0);
nums.push_back(1);
nums.push_back(2);
nums.push_back(-1);
nums.push_back(-4);
threeSum(nums);
}
算法思想:
- 也是运用双指针,先对数组进行排序
- 难点在于:
-
①、对vector去重
-
②、剪枝