18. 4Sum

四数之和算法解析

吸取了3sum用回溯法求解会超时的教训,本题采纳“双指针”扩广法:

class Solution {
public:
    
 vector<vector<int> > fourSum(vector<int> &num, int target) { 
 	vector<vector<int>> ans;
 	if(num.size()<4)
 		return ans;

    sort(num.begin(),num.end());//sort排序,便于剔除重复解答
 	vector<int> flag;
 	int i=0;
 	while(i<num.size()-3)//4 sum
 	{
 		int j=i+1;

 		while(j<num.size()-2) //3 sum
 		{
 			int begin=j+1,end=num.size()-1;
 			while(begin<end) //2 sum
 			{
 				int temp=num[i]+num[j]+num[begin]+num[end];
	 			if(temp==target)
	 			{
	 				flag.push_back(num[i]);
	 				flag.push_back(num[j]);
	 				flag.push_back(num[begin]);
	 				flag.push_back(num[end]);

	 				ans.push_back(flag);
	 				flag.clear();

	 				begin++;
	 				end--;
	 				while(num[begin]==num[begin-1])
	 					begin++; //剔除重复解答
	 				while(num[end]==num[end+1])
	 					end++;
	 			}
	 			else
	 			{
	 				if(temp<target)
	 					begin++;
	 				else
	 					end--;
	 			}
	 		}

	 		j++;
	 		while(num[j]==num[j-1])
	 			j++;
 		}

 		i++;
 		while(num[i]==num[i-1])
 			i++;

 	}
 	return ans;

  }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值