您的位置:首页 > 其它

18. 4Sum

2016-02-28 11:20 369 查看
GivenanarraySofnintegers,arethereelementsa,b,c,anddinSsuchthata+b+c+d=target?Findalluniquequadrupletsinthearraywhichgivesthesumoftarget.

Note:

Elementsinaquadruplet(a,b,c,d)mustbeinnon-descendingorder.(ie,a≤b≤c≤d)

Thesolutionsetmustnotcontainduplicatequadruplets.

注意:

加入剪枝条件:

if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)
  break;
if(nums[i]+nums[j]+nums[l-2]+nums[l-1]<target)
  continue;
加之前120ms,之后20ms。


classSolution{
public:
vector<vector<int>>fourSum(vector<int>&nums,inttarget){
intl=nums.size(),sum,left,right,i,j;
vector<vector<int>>ans;
if(l<4)
returnans;
sort(nums.begin(),nums.end());
for(i=0;i<l-3;i++)
{
if(i&&nums[i]==nums[i-1])
continue;
for(j=i+1;j<l-2;j++)
{
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)
break;
if(nums[i]+nums[j]+nums[l-2]+nums[l-1]<target)
continue;
if(j>i+1&&nums[j]==nums[j-1])
continue;
sum=nums[i]+nums[j];
left=j+1;
right=l-1;
while(left<right)
{
if(sum+nums[left]+nums[right]==target)
ans.push_back({nums[i],nums[j],nums[left++],nums[right--]});
elseif(sum+nums[left]+nums[right]<target)
left++;
else
right--;
while(left>j+1&&nums[left]==nums[left-1])
left++;
while(right<l-1&&nums[right]==nums[right+1])
right--;
}
}
}
returnans;
}
};



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: