题目:
解答:
与之前的三数之和的解法类似,也是先排序,然后不断剔除不可能的条件,最后两个参数,通过两头求和计算得出。
代码:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
int len = nums.size();
if(len < 4) return result;
sort(nums.begin(), nums.end());
for(int i = 0;i < len - 3;){
if(nums[i] * 4 > target) break;
for(int j = i + 1;j < len - 2;){
if((nums[i] + nums[j]) * 2 > target) break;
int remain = target - nums[i] - nums[j];
int begin = j + 1, end = len - 1;
while(begin < end){
int tmp = nums[begin] + nums[end];
if(tmp > remain){
while(begin < end && nums[end-1] == nums[end])
--end;
--end;
}
else if(tmp < remain){
while(begin < end && nums[begin+1] == nums[begin])
++begin;
++begin;
}
else{
vector<int> vec({nums[i], nums[j], nums[begin], nums[end]});
result.push_back(vec);
while(begin < end && nums[end-1] == nums[end])
--end;
while(begin < end && nums[begin+1] == nums[begin])
++begin;
--end, ++begin;
}
}
while(j < len - 2 && nums[j+1] == nums[j]) ++j;
++j;
}
while(i < len - 3 && nums[i+1] == nums[i]) ++i;
++i;
}
return result;
}
};
更新会同步在我的网站更新(https://zergzerg.cn/notes/webnotes/leetcode/index.html)