#18 FourSum leetCode
解决完三个数字之和,发现又来一个四个数字的和,真的服LeetCode.
这是用C++实现的执行结果,还不错。主要模仿三数之和的写法。感觉没有什么特别好的方法。首先排序然后用双指针。
具体实现(C++)
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
if (nums.size()<4)return {};
int length = nums.size();
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int i = 0; i<nums.size()-3;i++)
{
// 规避重复的数字
if(i>0 && nums[i]==nums[i-1])
{
continue;
}
// 如果当前最小值还要比target要大的时候,我们可以直接结束循环,
// 因为之后的素sum都会起码比这个大
int currentMinSum = nums[i]+nums[i+1]+nums[i+2]+nums[i+3];
if (currentMinSum > target)
{
break;
}
// 如果当前的最大值比target还要小的时候,那么这次的循环也可以跳过,因为比当前最大值小的和不可能是target
int currentMaxSum = nums[i]+ nums[length-1]+nums[length-2]+nums[length-3];
if(currentMaxSum < target)
{
continue;
}
for(int k = i+1 ;k<nums.size()-2;k++)
{
// 同理
if(k>i+1 && nums[k]==nums[k-1]) continue;
int left = k+1;
int right= nums.size()-1;
// 同理
int min = nums[i]+nums[k]+nums[k+1]+nums[k+2];
if(min > target)
{
break;
}
// 同理
int max = nums[i]+ nums[k]+nums[right]+nums[right-1];
if(max < target)
{
continue;
}
// 双指针循环
while(left<right)
{
if(nums[i]+nums[k]+nums[left]+nums[right] == target)
{
vector<int> element = {nums[i],nums[k],nums[left],nums[right]};
result.push_back(element);
left++;
while(left<right && nums[left-1] == nums[left])
{
left++;
}
right--;
while(left<right && nums[right+1] == nums[right])
{
right--;
}
}
else if(nums[i]+nums[k]+nums[left]+nums[right] > target)
{
right --;
}
else if(nums[i]+nums[k]+nums[left]+nums[right] < target)
{
left ++;
}
}
}
}
return result;
}
};