都要求结果集中不能有重复的。且每个子集中的元素为非递减顺序。
可以从实现O(N^(k-1))的复杂度。利用求两个数相加和为target的算法,扩展到3个和4个的情况。
一下给出4个时的程序,3个的情况可以类推。
class Solution {
public:
vector<vector<int> > fourSum(vector<int>& nums, int target) {
vector<vector<int> > ret;
if(nums.size() < 4)
return ret;
sort(nums.begin(), nums.end());
for(int i=0; i<=nums.size()-3; ++i) {
if(i>0 && nums[i]==nums[i-1])
continue;
int iter=i+1;
while(iter <= nums.size()-2) {
if(iter>i+1 && nums[iter]==nums[iter-1]){
++iter;
continue;
}
int left=iter+1, right=nums.size()-1;
while(left < right) {
if(left>iter+1 && nums[left]==nums[left-1]) {
++left;
continue;
}
if(right<nums.size()-1 && nums[right]==nums[right+1]){
--right;
continue;
}
int sum=nums[i]+nums[iter]+nums[left]+nums[right];
if(sum > target) {
--right;
}
else if(sum < target) {
++left;
}
else {
vector<int> four;
four.push_back(nums[i]);
four.push_back(nums[iter]);
four.push_back(nums[left]);
four.push_back(nums[right]);
ret.push_back(four);
++left;
--right;
}
}
++iter;
}
}
return ret;
}
};