原题链接
双指针法
AC(c++)
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;//定义返回结果
int len=nums.size();
if(len<4)//向量中如果小于四个数直接返回
return res;
sort(nums.begin(),nums.end());//快排,为双指针法和去重做准备
if(nums[len-4]+nums[len-3]+nums[len-2]+nums[len-1]<target)//如果最大值小于目标值,直接返回
return res;
for(int i=0;i<len-3;i++)//第一层循环
{
if(i>0&&nums[i]==nums[i-1])//去重复
continue;
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)//该层循环最小和大于目标值,跳出循环
break;
if(nums[i]+nums[len-3]+nums[len-2]+nums[len-1]<target)//该层循环最大和小于目标值。舍弃该层循环
continue;
for(int j=i+1;j<len-2;j++)//第二层循环
{
if(j>i+1&&nums[j]==nums[j-1])//去重复,但可以nums[i]=nums[j]
continue;
int L=j+1,R=len-1;
while(L<R)//开始双指针表演
{
if(nums[i]+nums[j]+nums[L]+nums[R]==target)
{
vector<int> r;
r.push_back(nums[i]),r.push_back(nums[j]),r.push_back(nums[L]),r.push_back(nums[R]);
res.push_back(r);
while(L<R&&nums[L+1]==nums[L])//去重
L++;
while(L<R&&nums[R-1]==nums[R])//去重
R--;
}
if(nums[i]+nums[j]+nums[L]+nums[R]<target)
L++;
else
R--;
}
}
}
return res;
}
};