链接:https://oj.leetcode.com/problems/4sum/
一种方法是跟3sum一样,使用头尾指针交替移动,时间复杂度为O(n3),空间复杂度为O(1),注意去重
class Solution
{
public:
vector<vector<int> >fourSum(vector<int> &num,int target)
{
vector<vector<int> > ans;
sort(num.begin(),num.end());
int n=num.size();
for(unsigned int i=0;i<n;i++)
{
if(i > 0 && num[i] == num[i-1])
continue;
for(unsigned int j=i+1;j<n;j++)
{
if(j > i + 1 && num[j] == num[j-1])
continue;
int st=j+1,en=n-1;
while(st<en)
{
if(st>j+1&&num[st]==num[st-1])
{
st++;
continue;
}
if(en<n-1&&num[en]==num[en+1])
{
en--;
continue;
}
int sum=num[i]+num[j]+num[st]+num[en];
if(sum>target)
en--;
if(sum<target)
st++;
if(sum==target)
{
vector<int> tem;
tem.push_back(num[i]);
tem.push_back(num[j]);
tem.push_back(num[st]);
tem.push_back(num[en]);
ans.push_back(tem);
tem.clear();
st++;
en--;
}
}
}
}
return ans;
}
};
还有一种比较高效的方法是牺牲空间复杂度去换取时间复杂度:
使用哈希表储存所有元素两两的和,然后在做一次2sum.
而且,2sum是有线性算法的:把所有元素放如哈希表中,通过哈希表判断target-num是否存在,因为利用了哈希表,所以每次判断只需常数级的时间。
去重的话,可以考虑set