链接: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