一、思路
与三数之和一样。三数之和是把最后两个数用双指针的方法去做,只筛选一个数就可以,四数之和也是一样的,只不过是前边筛选的时候三数之和是筛选一个,四数之和是筛选两个,明白了这个之后,就可直接开始写了。在三数之和前边套一层循环即可,其余的全都一样。
二、代码
代码如下:
1.python
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
n = len(nums)
nums.sort()
res = []
if n < 4:
return res
for i in range(n-3):
if i > 0 and nums[i] == nums[i-1]:
continue
if nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target:
break
for j in range(i+1,n-2):
if j > i+1 and nums[j] == nums[j-1]:
continue
if nums[i] + nums[j] + nums[j+1] + nums[j+2] > target:
break
l,r = j+1,n-1
while l < r:
if nums[i] + nums[j] + nums[l] + nums[r] == target:
res.append([ nums[i] , nums[j] ,nums[l] , nums[r] ])
while l < r and nums[l] == nums[l+1]:
l += 1
while l < r and nums[r] == nums[r-1]:
r -= 1
l += 1
r -= 1
elif nums[i] + nums[j] + nums[l] + nums[r] >target:
r -= 1
else :
l += 1
return res
2.C++
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
if(nums.size()<4){
return {};
}
for(int i =0;i<nums.size()-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;
}
for(int j =i+1;j<nums.size()-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;
}
int l = j+1, r=nums.size()-1;
while(l < r){
if(nums[i] + nums[j] + nums[l] + nums[r] == target){
res.push_back({nums[i] , nums[j] , nums[l] , nums[r]});
while(l < r && nums[l] == nums[l+1]){
l++;
}
while(l < r && nums[r] == nums[r-1]){
r--;
}
l++;
r--;
}
else if(nums[i] + nums[j] + nums[l] + nums[r] > target){
r--;
}
else{
l++;
}
}
}
}
return res;
}
};