四数之和
题意为在数组中查找四个数和目标数相等,可以利用双指针进行查找。
这题和LeetCode15:三数之和是同一个解题模板。
若nums[i]+nums[j]+nums[left]+nums[right]<target
说明四数之和过小,所以left++
;
若nums[i]+nums[j]+nums[left]+nums[right]>target
说明四数之和过大,所以right--;
如果相等则保存四个数,接着对i,j,left,right进行去重,跳过重复的元素进行查找,最终输出数组。
解决代码:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
if(nums.size()<4) return {};
sort(nums.begin(),nums.end());
vector<vector<int>> a;
for(int i=0;i<nums.size()-2;i++)
{
for(int j=i+1;j<nums.size()-1;j++)
{
int left=j+1,right=nums.size()-1;
while(left<right)
{
if(nums[i]+nums[j]+nums[left]+nums[right]<target)
{
left++;
}
else if(nums[i]+nums[j]+nums[left]+nums[right]>target)
{
right--;
}
else
{
a.push_back({nums[i],nums[j],nums[left],nums[right]});
while(left<right&&nums[left]==nums[left+1])
left++;
while(left<right&&nums[right]==nums[right-1])
right--;
left++;
right--;
}
}
while(j+1<nums.size()&&nums[j]==nums[j+1]) j++;
}
while(i+1<nums.size()&&nums[i]==nums[i+1]) i++;
}
return a;
}
};