不用说了,4数之和最接近target
那么,是否是通过3Sum优化成的4Sum
即先确定一个,然后转化为3Sum问题。
注意事项:结果不包括重复串。
返回值:相应的数字对(可以排序
输入值:数字的向量,int的target
边界确认,第一个数字开始为0,结束为size-4
起码快速通过:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
int size = nums.size();
if(size < 4) return result;
sort(nums.begin(), nums.end());
int temp = 0;
for(int i = 0; i<size-3;){
for(int j = i+1; j<size - 2;){
int twoSum = target - nums[i] - nums[j];
int m = j+1;
int n = size - 1;
while(m<n){
if(nums[m]+nums[n]-twoSum > 0){
do{
temp = nums[n];
n --;
}while(m<n && temp == nums[n]);
}else if(nums[m]+nums[n] - twoSum <0){
do{
temp = nums[m];
m++;
}while(m<n&& temp == nums[m]);
}else{
result.push_back({nums[i], nums[j], nums[m], nums[n]});
do{
temp = nums[m];
m++;
}while(m<n&& temp == nums[m]);
}
}
do{
temp = nums[j];
j++;
}while(j <size - 2&& temp == nums[j]);
}
do{
temp = nums[i];
i++;
}while(i<size-3 && temp == nums[i]);
}
return result;
}
};
没什么好说的,由于对sum问题比较熟悉,就不看别人的例子了。