Paste_Image.png
思路:
对数据进行排序
2)为了得到非重复的三元组 不断移动哨兵位置
时间复杂度为O(n*n)
对于4 sum问题 其时间复杂度为O(n^3)
vector> threeSum(vector& nums) {
vector> res;
if(nums.size()<3)
return res;
sort(nums.begin(),nums.end());
int left,right;
for(int i=0;i
{
left=i+1;right=nums.size()-1;
int target=0-nums[i];
while(left
{
int temp=nums[left]+nums[right];
if(temp==target)
{
vector hh={nums[i],nums[left],nums[right]};
//sort(hh.begin(),hh.end());
res.push_back(hh);
while(nums[left]==hh[1]&&left
left++;
while(nums[left]==hh[1]&&left
right--;
continue;
}
if(temp>target)
{
right--;
continue;
}
if(temp
{
left++;
continue;
}
}
//理解为什么要这样去除重复数据
while (i + 1 < nums.size() && nums[i + 1] == nums[i])
i++;
}
return res;
}
Paste_Image.png
思路:
1)将数据分为前后两部分
2)C、D数组数据相加后添加到unordered_map中,map键为和,值为个数
时间复杂度:O(n*n)
int fourSumCount(vector& A, vector& B, vector& C, vector& D) {
int N=A.size();
vector dt;
for(int i=0;i
for(int j=0;j
dt.push_back(A[i]+B[j]);
//将4个数组分为两部分,dt存储前一部分
//kk 存储寻找的数据 使用键作为数据 值作为数据的个数
unordered_map kk;
for(int i=0;i
for(int j=0;j
kk[C[i]+D[j]]++;
int res=0;
for(int i=0;i
{
if(kk.find(0-dt[i])!=kk.end())
res+=kk.find(0-dt[i])->second;
}
return res;
}