leetcode 4sum



Given an array S of n integers, are there elements a, b, c, 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, abcd)
  • 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)
 
class Solution {
public:
    vector<vector<int> > fourSum(vector<int> &num, int target) {
    vector<vector<int> > vResult;
    vResult.reserve(100);
    if(num.empty()) return vResult;

    sort(num.begin(), num.end());
    for(size_t i = 0; i<num.size()-1; i++)
    {
		if(i>0 && num[i-1] == num[i])
		{
			continue;
		}
        for(size_t j=i+1; j<num.size(); j++)
        {
            if(j>=i+2 && num[j-1] == num[j])
            {
                continue;
            }
            size_t m = j + 1;
            size_t n = num.size() -1;
            while(m < n)
            {
				if(m > j+1 && num[m-1] == num[m])
				{
					m++;
					continue;
				}
				if(n <num.size()-1 && num[n] == num[n+1])
				{
					n--;
					continue;
				}
                if(num[i] + num[j] + num[m] + num[n] == target)
                {
                    vector<int> vInt;
                    vInt.reserve(100);
                    vInt.push_back(num[i]);
                    vInt.push_back(num[j]);
                    vInt.push_back(num[m]);
                    vInt.push_back(num[n]);
                    vResult.push_back(vInt);
                    m++;
                }
                else if(num[i] + num[j] + num[m] + num[n] < target)
                {
                    m++;
                }
                else
                {
                    n--;
                }
            }
        }
    }
    return vResult;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值