可恶,这几天不知道为什么,根本没好好干活。沉淀…
LC15 三数之和
在labuladong的文章里学到了nSum的通用模板,只能说背吧。基本的思路都是厘清了的,就是递归到2Sum的base问题。LC18 四数之和道理一样。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
return nSumTarget(nums, 3, 0, 0);
}
vector<vector<int>> nSumTarget(vector<int>& nums, int n, int start, int target){
int sz=nums.size();
vector<vector<int>> ans;
if(n<2 || sz<n)return ans;
if(n==2){
int lo=start, hi=sz-1;
while(lo<hi){
int sum=nums[lo]+nums[hi];
int left=nums[lo], right=nums[hi];
if(sum<target){
while(lo<hi && nums[lo]==left)lo++;
}
else if(sum>target){
while(lo<hi && nums[hi]==right)hi--;
}
else{
ans.push_back({left,right});
while(lo<hi && nums[lo]==left)lo++;
while(lo<hi && nums[hi]==right)hi--;
}
}
}
else{
for(int i=start;i<sz;i++){
vector<vector<int>> sub=nSumTarget(nums, n-1, i+1, target-nums[i]);
for(auto& arr:sub){
arr.push_back(nums[i]);
ans.push_back(arr);
}
while(i<sz-1 && nums[i]==nums[i+1])i++;
}
}
return ans;
}
};
这里需要注意的是在第12行的int lo=start, hi=sz-1;
中lo=start
而不是lo=0
。找了好久的bug,不然会导致输出重复的答案。
对了,在四数之和中,需要做以下改动。首先,在fourSum
中
return nSumTarget(nums,4,0,target);//(nums,4,0,0);
然后在测试的时候是能通过样例的,但是在提交时会报错超出int范围,只需要把nSumTarget的函数的target
改为long
。
vector<vector<int>> nSumTarget(vector<int>& nums, int n, int start, long target){