今日任务:
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
//把四个数组分成两个两个一组
unordered_map<int,int> map;
//把1 2 个数组的值都加到map里面去
for(int a : nums1){
for(int b : nums2){
map[a + b]++;
}
}
int count = 0;
//遍历3 4数组,查找用0-(c+d)的值,就是(a+b),找到了就+=count 因为有可能a+b是同一个值
for(int c : nums3){
for(int d : nums4){
if(map.find(0 - (c + d)) != map.end()){
count += map[0 - (c + d)];
}
}
}
return count;
}
};
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
//要先排序下数组
sort(nums.begin(),nums.end());
//思路:四个指针 k i left right
for(int k = 0; k < nums.size(); k++)
{
//先把k指针剪枝,因为排序过数组,如果nums[k]大于0了,并且target大于0,就不可能后面有匹配的元祖
if(nums[k] > target && nums[k] >= 0)
{
break;
}
//k去重
if(k > 0 && nums[k] == nums[k - 1])
{
continue;
}
//创建i指针
for(int i = k + 1; i < nums.size(); i++)
{
//给i剪枝
if(nums[k] + nums[i] > target && nums[k] + nums[i] > 0)
{
break;
}
//i去重
if(i > k + 1 && nums[i] == nums[i-1])
{
continue;
}
//创建left right指针
int left = i + 1;
int right = nums.size() - 1;
//开始遍历这里要用left < right
while(left < right)
{
//如果四个元素加起来大了,那么让right指针--;(注意int溢出)
if((long)nums[i] + nums[k] + nums[left] + nums[right] > target)
{
right--;
}
//如果四个元素加起来小了,那么让left++
else if((long)nums[i] + nums[k] + nums[left] + nums[right] < target)
{
left++;
}
else
{
//匹配到了把四个值push到vector里面
result.push_back(vector<int>{nums[i],nums[k],nums[left],nums[right]});
//然后给left去重
while(left < right && nums[left] == nums[left + 1])
{
left++;
}
//给right去重
while(left < right && nums[right] == nums[right - 1])
{
right--;
}
//去重完之后两个指针向中间缩
left++;
right--;
}
}
}
}
return result;
}
};