前提:看完三数之和再来看这篇
思路:(双指针算法)最优
1.排序
2.固定一个数a
3.用“三数之和”的方法找到三个数,使== target -a
? ?3.1固定一个数b
? ?3.2用“双指针”找到两个数,使 == target -a -b
细节:
1.去重
1.1 left? right走的时候需要去重
1.2?b往后走需要去重
1.3 a往后走需要去重
class Solution
{
public:
vector<vector<int>> fourSum(vector<int>& nums, int target)
{
vector<vector<int>> v;
//1.排序
sort(nums.begin(),nums.end());
//2.固定a
for(int i=0;i<nums.size();)
{
//3.固定b
for(int j=i+1;j<nums.size()-1;)
{
int left = j+1, right = nums.size()-1;
//4.双指针开始
while(left<right)
{
int sumin = nums[left] + nums[right];
long long targetin = (long long)target - nums[i] - nums[j];
if(sumin > targetin)
{
right--;
}
else if(sumin < targetin)
{
left++;
}
else
{
v.push_back({nums[i],nums[j],nums[left],nums[right]});
left++;
right--;
//去重left right
while(left < right && nums[left]==nums[left-1])
{
left++;
}
while(left < right && nums[right]==nums[right+1])
{
right--;
}
}
}
//去重b
j++;
while(j<nums.size()-1 && nums[j]==nums[j-1])
{
j++;
}
}
//去重a
i++;
while(i<nums.size() && nums[i]==nums[i-1])
{
i++;
}
}
return v;
}
};