四数之和
思路:
设a+b+c+d = target
,且a<=b<=c<=d,将等式移项可以得到c+d = target - a -b
,就是先枚举最小的数a
和b
,从后面的数组中找到两数之和为target - a -b
,要求不重复,首先还是要先对数组进行排序,遇到相同的a
只枚举一个,b
也是一样的。还是用双指针,再三数之和的基础上再加一个循环。
注意:设sum=target-a-b
,sum
要设为long long
类型,否则用int 就会溢出。
代码如下:
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;i++){
//i去重
if(i > 0 && nums[i] == nums[i-1]) continue;
for(int j = i + 1;j < n;j++){
//j去重
if(j > i + 1 && nums[j] == nums[j-1]) continue;
//定义左右指针
int l = j + 1,r = n - 1;
//注意用int会溢出,用long long
//a+b+c+d = target,转化成c+d = target-a-b
long long sum = (long long)target - nums[i] - nums[j];
//跟3数之和差不多
while(l < r){
//比较c+d和sum的大小,大了,r--,小了,l++
//相等就加进答案
if(nums[l] + nums[r] == sum){
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[l] + nums[r] < sum) l++;
else r--;
}
}
}
return res;
}
};