题目连接:https://leetcode-cn.com/problems/4sum/
解题思路
此处撰写解题思路
第一层循环 从0-->n-3
去掉重复
if(i>0 && nums[i]==nums[i-1])continue;
如果当前元素和后三个元素之和大于target直接break
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3] > target) break;
如果当前元素和倒数三个元素之和小于target就继续
if(nums[i]+nums[n-3]+nums[n-2]+nums[n-1]< target) continue;
第二层循环
从i+1->n-2
去掉重复
if(j>i+1&& nums[j]==nums[j-1]) continue;
第一层循环的值加上当前循环的值 后两位之和大于target 就break
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target) break;
第一层循环的值加上当前循环的值 倒数两位的和小于target 就continue
if(nums[i]+nums[j]+nums[n-2]+nums[n-1]<target) continue;
这样就固定住第一个和第二个值 那么久从j+1 和 n-1两端夹逼
如果四个值相加的和等于target 那么就放入vector中 去重操作和LR前后夹逼
如果和大于target那么就是L++
反之则R--
最后返回vector
代码
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
int n = nums.size();
if(n < 4) return res;
sort(nums.begin(),nums.end());
for(int i =0; i<n-3;i++){
if(i>0 && nums[i]==nums[i-1])continue;
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3] > target) break;
if(nums[i]+nums[n-3]+nums[n-2]+nums[n-1]< target) continue;
for(int j=i+1;j<n-2;j++){
if(j>i+1&& nums[j]==nums[j-1]) continue;
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target) break;
if(nums[i]+nums[j]+nums[n-2]+nums[n-1]<target) continue;
int L = j+1;
int R = n-1;
while(L<R){
int sum=nums[i]+nums[j]+nums[L]+nums[R];
if(sum<target) L++;
else if(sum>target) R--;
else{
res.push_back({nums[i],nums[j],nums[L],nums[R]});
// do{L++;}while(nums[L]==nums[L-1]&&L<R);
// do{R--;}while(nums[R]==nums[R+1]&&L<R);
while(L<R &&nums[L] == nums[L+1]) L++;
while(L<R &&nums[R] == nums[R-1]) R--;
L++;
R--;
}
}
}
}
return res;
}
};
作者:mao1992
链接:https://leetcode-cn.com/problems/4sum/solution/c-16ms-by-mao1992/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。