本文最后更新于630 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
题目链接/文章讲解/视频讲解:https://programmercarl.com/0018.%E5%9B%9B%E6%95%B0%E4%B9%8B%E5%92%8C.html
1.有了三数之和的思路之后做这个题其实感觉还算有思路,我自己把大框架的思路写完之后,看了代码随想录里的思路,没有想到,两层for循环定义i j变量进行操作,然后进行剪枝,去重操作,没想到的是在第一层循环里进行一级剪枝,一级去重,然后在二层循环里,进行二级剪枝,二级去重,其他的思路不变。
CPP
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
for(int i = 0;i<nums.size();i++){
if(nums[i]>target && nums[i]>=0 && target>0) break;
if(i>0 && nums[i] == nums[i-1]){
continue;
}
for(int j = i+1;j<nums.size();j++){
if(nums[i] + nums[j]>target && nums[i] + nums[j]>=0&&target>0) break;
if(j>i+1 && nums[j] == nums[j-1]){
continue;
}
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{
res.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]});
while(left<right && nums[left] == nums[left+1]) left++;
while(left<right && nums[right] == nums[right-1]) right--;
right--;
left++;
}
}
}
}
return res;
}
};