解析:思想和3sum一样
1.先排序,固定3个数,设置一个游标在区间移动
2.若当前4个数的和小于目标值,游标向右移;若当前4个数的和大于目标值,即右边的数过大,向左移动;若相等,记录当前的值,并分别对第3和第4个数去重
优化:
1.若目标值小于0,且当前游标代表的值大于0,则4个数的和一定不等于目标值,结束
2.若目标值大于0,且当前游标代表的值大于目标值,则4个数的和一定不等于目标值,结束
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector< vector<int> > result;
vector<int> result_element;
int sum;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i){
if (target < 0 && nums[i] > 0) break;
if (target > 0 && nums[i] > target) break;
if (i > 0 && nums[i] == nums[i-1]) continue; //第1个数去重
for (int j = i + 1; j < nums.size(); ++j){
if (j > i + 1 && nums[j] == nums[j-1]){ //第2个数去重
continue;
}
int k = j + 1;
int end = nums.size() - 1;
while (k < end){
sum = nums[i] + nums[j] + nums[k] + nums[end];
if (sum > target){
end--;
}
else if (sum < target){
k++;
}
else{
result_element.push_back(nums[i]);
result_element.push_back(nums[j]);
result_element.push_back(nums[k]);
result_element.push_back(nums[end]);
result.push_back(result_element);
result_element.clear();
while (k < end && nums[k] == nums[k+1]) k++; //第3个数去重
while (k < end && nums[end] == nums[end-1]) end--; //第4个数去重
k++;
end--;
}
}
}
}
return result;
}
};
[1]https://www.cnblogs.com/grandyang/p/4515925.html