目录
四数之和
//将外层做两个循环
vector<vector<int>> ans;
for(int i=0;i<nums.size();i++)
{
//第一层剪枝
if(nums[i]>target&&nums[i]>=0) break;
if(i>0&&nums[i]==nums[i-1]){
continue;
}
for(int j=i+1;j<nums.size();j++)
{
//第二层遍历,减枝
if(nums[i]+nums[j]>target&&nums[i]+nums[j]>=0) break;
if(nums[j]==nums[j-1]){
continue;
}
//开始判断后两位
int left=j+1;
int right=nums.size()-1;
while(left<right){
if((long)nums[i]+nums[j]+nums[left]+nums[right]>target){
right--;
}
else if((long)nums[i]+nums[j]+nums[left]+nums[right]<target){
left++;
}
else{
ans.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]});
while(left<right&&nums[left]==nums[left+1]) left++;
while(left<right&&nums[right]==nums[right-1]) right--;
left++;
right--;
}
}
}
}
return ans;