3Sum(双指针+暴力)
题目详情
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得
a
+
b
+
c
=
0
?
a + b + c = 0 ?
a+b+c=0?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> t;
map<string,int> mp;
sort(nums.begin(),nums.end());//首先排个序
for(int i=0;i<nums.size();i++)
{
if(nums[i]>=0)
{
if(mp["000"]==1||nums[i]>0)
{
break;
//如果已经遍历到正数或者000组合已经在ans中,再次遇到就直接跳出循环,节约时间
}
}
//定义双指针
int j = i + 1;
int k = nums.size()-1;
while(j<k)
{
if(-nums[i]>nums[j]+nums[k])
{
j++;//三者之和小于0,让负的部分大一些
}
else if(-nums[i]<nums[j]+nums[k])
{
k--;//三者之和大于0,让正的部分小一些
}
else
{
t.push_back(nums[i]);
t.push_back(nums[j]);
t.push_back(nums[k]);
//将结果三个数存到vector t中
sort(t.begin(),t.end());//很重要,必须排序
string s;
s = to_string(t[0])+to_string(t[1])+to_string(t[2]);
//转化为string,利用map进行映射
if(mp[s]==0)
{
//若ans里之前没有,就把t放到ans里,并在mp里标记为有
mp[s]++;
ans.push_back(t);
}
t.clear();//一定不要忘记清空t
j++;
k--;
}
}
}
return ans;
}
};