跟三数和一样,我还以为有什么高端解法……我觉得用while循环比较好,另外需要注意的就是每个循环后面都要处理越过重复数的问题。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int size=nums.size();
if(size<4) return {
};
vector<vector<int>> res;
sort(nums.begin(),nums.end());
int i=0;
while(i<size-3)
{
int first=nums[i];
if(first>target/4) break;
int j=i+1;
while(j<size-2)
{
int second=nums[j];
if(second>(target-first)/3) break;
int k=j+1,m=size-1;
while(k<m)
{
int third=nums[k],forth=nums[m];
if((first+second+third+forth)==target)
res.push_back({
first,second,nums[k],nums[m]});
if(first+second+third+forth>target)
while(k<m&&nums[m]==forth)
--m;
else
while(k<m&&nums[k]==third)
++k;
}
while((j<size-2)&&nums[j]==second)
++j;
}
while((i<size-3)&&nums[i]==first)
++i;
}
return res;
}
};
但是思考的话,还是有可以考虑的地方,如果说是nSum问题的n更大,这个函数就太长了,实际上可以做成递归。边界条件为两数和,层层递归,排序依次,复杂度在O(N^(n-1))