LeetCode 4sum

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

原文地址:https://www.cnblogs.com/frankM/p/4399426.html