day7
还行独立做出来了大部分,思路和 三数之和是类似的
就是对四个指针去重的操作
有坑!!!
:
1. 如果要剪枝,需要考虑 target 为负数的情况
2.在剪枝的时候,要用break 不能直接return res ,因为有两层for循环啊!!!
真是、。。。如果剪枝不会剪,还不如不剪了
3. 注意数相加可能会溢出,要转换为 long 类型
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target)
{
// 如果本题也用双指针的话,由四个数,是不是要用两个 for 表示可以自己变的指针呢?
// 本题也需要去重
vector<vector<int>> res;
//先排序
sort(nums.begin(), nums.end());
for(int i = 0 ; i < nums.size() ; i++)
{
// 对 i 剪枝
if(nums[i] > target && nums[i] >=0 )
break;
// 对 i 去重
if(i > 0 && nums[i] == nums[i - 1])
continue;
for(int j = i + 1; j < nums.size() ; j++)
{
// 对 j 剪枝
if(nums[i] + nums[j] > target&& (nums[i] + nums[j]) >=0 )
break;
// 对 j 去重
if(j > i + 1 && nums[j] == nums[j - 1])
continue;
int left = j + 1;
int right = nums.size() - 1;
while(left < right)
{
if((long) nums[i] + nums[j] + nums[left] + nums[right] > target)
right--;
else if((long)nums[i] + nums[j] + nums[left] + nums[right] < target)
left++;
else
{
res.push_back({nums[i],nums[j],nums[left],nums[right]});
while( right > left && nums[right] == nums[right - 1])
right--;
while( right > left && nums[left] == nums[left + 1])
left++;
right--;
left++;
}
}
}
}
return res;
}
};