题意:一个数组中,找出4个数之和为指定target的。
分析:又是一类超经典的数组中找和为某数的组合问题,一般通过定数扫描的方法可以减少一阶复杂度,4个数的话就可以先固定头两个数再扫描,注意解不要重复,按数字来扫不要按位扫就好。
AC:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
int s=nums.size();
sort(nums.begin(),nums.end());
int i,j;
for(int m=0;m<s-2;m++)
{
if(m>0&&nums[m]==nums[m-1]) continue;
for(int n=m+1;n<s-1;n++)
{
if(n>m+1&&nums[n]==nums[n-1]) continue;
i=n+1;
j=s-1;
while(i<j)
{
if(nums[i]+nums[j]+nums[m]+nums[n]>target)
j--;
else if(nums[i]+nums[j]+nums[m]+nums[n]<target)
i++;
else
{
while(nums[i]==nums[i+1] && i<j) i++;
while(nums[j]==nums[j-1] && i<j) j--;
res.push_back({nums[m],nums[n],nums[i],nums[j]});
i++;j--;
}
}
}
}
return res;
}
};