4Sum

Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
  • The solution set must not contain duplicate quadruplets.

    For example, given array S = {1 0 -1 0 -2 2}, and target = 0.

    A solution set is:
    (-1,  0, 0, 1)
    (-2, -1, 1, 2)
    (-2,  0, 0, 2)
跟3sum很类似。 需枚举前俩个!

    vector<vector<int> > fourSum(vector<int> &num, int target) 
    {
    	if(num.size() < 4) return  vector<vector<int> >();
    
    	vector<vector<int> > res;
    	
    	sort(num.begin(),num.end());
    
    	for (int k = 0;k <= num.size()-4;k++)//先枚举前俩个,最后俩个求和
    	{
    		if(k > 0 && num[k] == num[k-1])continue;
    		for(int i = k+1;i <= num.size()-3;i++)
    		{
    			if(i > k+1 && num[i] == num[i-1])continue;
    
    			int my_target = target - num[k] - num[i];
    			int left = i+1;
    			int right = num.size()-1;
    		
    			while(left < right)
    			{
    				if(my_target == num[left] + num[right])
    				{
    					vector<int>  res_one;
    					res_one.push_back(num[k]);
    					res_one.push_back(num[i]);
    					res_one.push_back(num[left]);
    					res_one.push_back(num[right]);
    
    					res.push_back(res_one);
    					
        				while(left < right && num[left] == num[left-1])//防止 000 222 求2的情况
    					left++;
    
    					right--;
    					while(left < right && num[right] == num[right+1])
    					right--;
    				}
    				else if (my_target < num[left] + num[right])
    				{
    					right-- ;
    				}
    				else
    				{
    					left++;
    				}
    			}
    		}
    	}
    	
    	return res;
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值