题目来源:
leetcode题目,网址:18. 四数之和 - 力扣(LeetCode)
解题思路:
排序+双指针。将数组排序后,枚举第一个元素和第二个元素,利用双指针寻找第三个元素和第四个元素。
解题代码:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
if(nums.size()<4){
return res;
}
sort(nums.begin(),nums.end());
long last2Sum=nums[nums.size()-1]+nums[nums.size()-2];
long last3Sum=last2Sum+nums[nums.size()-3];
if( last3Sum+nums[nums.size()-4]<target){
return res;
}
for(int i=0;i<nums.size()-3;i++){
if(nums[i]+last3Sum < target ){
continue;
}else if(i!=0 && nums[i]==nums[i-1]){
continue;
}
for(int j=i+1;j<nums.size()-2;j++){
long newTarget=(long)target-nums[i]-nums[j];
if(nums[j+1]+nums[j+2]>newTarget){
break;
}else if(nums[i]+nums[j]+last2Sum<target || (j!=i+1 && nums[j]==nums[j-1])){
continue;
}
int left=j+1;
int right=nums.size()-1;
while(left<right){
long sum=nums[left]+nums[right];
if(sum<newTarget){
left++;
}else if(sum>newTarget){
right--;
}else{
vector<int> vec={nums[i],nums[j],nums[left],nums[right]};
res.push_back(vec);
left++;
while(left<right && nums[left]==nums[left-1]){
left++;
}
}
}
}
}
return res;
}
};
总结:
注意四数之和可能超出 int 表示范围。
官方题解也是排序+双指针。