先来看看twosum的解决:
vector<vector<int>>twosum(vector<int>&nums,int target)
{
int size=nums.size();
int start=0;
int end=size-1;
vector<int>ans;
while(start<end){
int sum=nums[start]+nums[end];
int left=nums[start],right=nums[end];
if(target<sum)
{
while(start<end&&nums[start]==left)++start;
}
else if(target>sum)
{
while(start<end&&nums[end]==right)--end;
}
else
{
ans.push_back({start,end});
}
}
return ans;
}
twosum是典型的双指针的解发。下面将twosum扩大到nsum的解决:
class Solution
{
private:
vector<vector<int>>twosum(vector<int>&nums,int target,int s)
{
int size=nums.size();
int start=s;
int end=size-1;
vector<int>ans;
while(start<end){
int sum=nums[start]+nums[end];
int left=nums[start],right=nums[end];
if(target<sum)
{
while(start<end&&nums[start]==left)++start;
}
else if(target>sum)
{
while(start<end&&nums[end]==right)--end;
}
else
{
ans.push_back({start,end});
}
}
return ans;
}
private:
vector<vector<int>>nSum(vector<int>&nums,int n,int start,int target)
{
int size=nums.size();
vector<vector<int>>res;
if(n<2||n>size) return res;
if(n==2)
{
res=twosum(nums,target,start);
}
else
{
for(int i=start,i<size;i++)
{
vector<vector<int>>sub=nSum(nums,n-1,i+1,target-nums[i]);
for(auto&arr:sub)
{
arr.push_back(nums[i]);
res.push_back(arr);
}
while(i<size-1&&nums[i]==nums[i+1])i++;
}
}
return res;
}
public:
//解决问题
};