思路
一重循环定下来一个数之后,用两个指针进行 夹击 确定是否等于-nums[i]。题目难点我认为是在于不重复。
会有重复代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
//特判
sort(nums.begin(),nums.end());
if(nums.size()<3||nums[0]>0||nums[nums.size()-1]<0){
return res;
}
//排序之后从负数到正数
//首先确定一个数,然后两个指针,j,k,k+j应该等于-(a)
int target;
int j,k;
for(int i=0;i< nums.size();i++)
{
if(nums[i]>0)
{
break;
}
target=-nums[i];
j=i+1;
k=nums.size()-1;
while(j<k)
{
if(nums[j]+nums[k]==target)
{
vector<int> temp={nums[i],nums[j],nums[k]};
res.push_back(temp);
//重复直接跳过
while(j<k&&nums[j]==nums[j+1]){
j++;
}
while(j<k&&nums[k]==nums[k-1])
{
k--;
}
j++;
k--;
}
else if(nums[j]+nums[k]<target)
{
j++;
}
else{
k--;
}
}
}
return res;
}
};
ac代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
//特判
sort(nums.begin(),nums.end());
if(nums.size()<3||nums[0]>0||nums[nums.size()-1]<0){
return res;
}
//排序之后从负数到正数
//首先确定一个数,然后两个指针,j,k,k+j应该等于-(a)
int target;
int j,k;
for(int i=0;i< nums.size();i++)
{
if(nums[i]>0)
{
break;
}
//去重复!!!!!
if (i > 0 && nums[i] == nums[i-1]) {
continue;
}
target=-nums[i];
j=i+1;
k=nums.size()-1;
while(j<k)
{
if(nums[j]+nums[k]==target)
{
vector<int> temp={nums[i],nums[j],nums[k]};
res.push_back(temp);
//重复直接跳过
while(j<k&&nums[j]==nums[j+1]){
j++;
}
while(j<k&&nums[k]==nums[k-1])
{
k--;
}
j++;
k--;
}
else if(nums[j]+nums[k]<target)
{
j++;
}
else{
k--;
}
}
}
return res;
}
};
总结
经过看题解之后进行改正。总共有两种重复,一个是在确定第一个数字nums[i]时候可能产生的重复,一个是在确定j,k时候可能会产生的重复,有了这个思路就比较明确了。