本题在三数之和的基础上,再增加一重循环进行解答
- 首先注意的点是,一级剪枝处理,target > 0 && nums[i] >= target 此处只有整数才可剪枝处理,如果target为负数,nums[i] < target,也不能代表后续无解,因为数组排序后是一个升序的数组。
- 二级去重,和一级去重类似,当当前元素与前一个相同时,则跳过
- 二级剪枝处理,个人认为在一定情况下,似乎无需进行
- 测试用例中有些数据的和,会超出int类型的范围,尝试在二级剪枝进行处理,但未能成功,只能选择在四数之和处使用long类型。
代码如下:
cpp
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<vector<int>> fourSum;
for(int i = 0; i < nums.size(); i++){
if(target > 0 && nums[i] >= target){
return fourSum;
}
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
for(int j = i + 1; j < nums.size(); j++){
if(j > i + 1 && nums[j] == nums[j - 1]){
continue;
}
if(nums[i] + nums[j] > target && nums[i] >= 0){
return fourSum;
}
int left = j + 1;
int right = nums.size() - 1;
while(left < right){
if((long) nums[i] + nums[j] + nums[left] + nums[right] > target){
right--;
} else if((long) nums[i] + nums[j] + nums[left] + nums[right] < target){
left++;
} else{
fourSum.push_back( {nums[i], nums[j], nums[left], nums[right]} );
while(left < right && nums[right] == nums[right - 1]){
right--;
}
right--;
while(left < right && nums[left] == nums[left + 1]){
left++;
}
left++;
}
}
}
}
return fourSum;
}
};