“四数之和”这个问题出现之后,相信大家也做了前面的三数之和之类的问题了,也肯定觉得这个继续做“几”数之和没啥意义。索性使用递归做一个n数之和。
本代码使用C++编写
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
return nsum(nums,4,0,target);
}
vector<vector<int>> nsum(vector<int> &nums,int n,int start,int target)
{
int size=nums.size();
vector<vector<int>> v;
if(n<2 || size<n)
{
return v;
}
if(n==2)
{
int left=start;
int right=size-1;
while(left<right)
{
int leftnum=nums[left];
int rightnum=nums[right];
int sum=leftnum+rightnum;
if(sum<target)
{
while(left<right && nums[left]==leftnum) left++;
}
else if(sum>target)
{
while(left<right && nums[right]==rightnum) right--;
}
else
{
v.push_back(vector<int>{leftnum,rightnum});
while(left<right && nums[left]==leftnum) left++;
while(left<right && nums[right]==rightnum) right--;
}
}
}
else
{
for(int i=start;i<size;i++)
{
vector<vector<int>> v_0=nsum(nums,n-1,i+1,target-nums[i]);
for(vector<vector<int>>::iterator it=v_0.begin();it!=v_0.end();it++)
{
vector<int> v_1;
v_1.push_back(nums[i]);
for(vector<int>::iterator itt=(*it).begin();itt!=(*it).end();itt++)
{
v_1.push_back((*itt));
}
v.push_back(v_1);
}
while(i<size-1 && nums[i+1]==nums[i])
{
i++;
}
}
}
return v;
}
};
使用递归的到n个加和,稍加修改可以得到n个加和值距离目标值最近,这些步骤交给读者,相信不会太难,如果有帮助想要你的一个点赞。
|