码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode(18)4Sum

时间:2015-08-08 20:01:47      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

题目

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, 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)

分析

类似于15题求解的3Sum问题,这次求解4Sum问题,本质是相同的,不可以采用穷举法;
其实求解4Sum问题可以分解为求3Sum问题,对数列依次遍历i,我们只需得到在第i个数后面,找出所有和为target?nums[i]的三元组,同理求3Sum又可以退化为2Sum,进而退化为1Sum
因此,采用递归的思想解决KSum问题。

AC代码

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> vv = KSum(nums, target, 4);
        int len = vv.size();
        for (int i = 0; i < len; i++)
            sort(vv[i].begin(), vv[i].end());

        return vv;
    }

    vector<vector<int>> KSum(vector<int> &nums, int target, int k)
    {
        vector<vector<int>> vv;
        int len = nums.size();

        if (len < k)
            return vv;

        sort(nums.begin() , nums.end());

        if (k == 1)
        {
            for (int i = 0; i < len; i++)
            {
                vector<int> v;
                if (nums[i] == target)
                {
                    v.push_back(nums[i]);
                    vv.push_back(v);                
                }

                while (((i + 1) < len) && (nums[i + 1] == nums[i]))
                {
                    i++;
                }               
            }//for
        }//if
        else
        {
            vector<int>::iterator iter = nums.begin();
            for (int i = 0; i < nums.size(); i++)
            {
                iter++;
                int j = 0;
                vector<int > _nums(iter, nums.end());
                vector<vector<int>> _vv = KSum(_nums, target - nums[i], k - 1);

                int _len = _vv.size();
                if (_len <= 0)
                    continue;

                for (int j = 0; j < _len; j++)
                {
                    _vv[j].push_back(nums[i]);
                    vv.push_back(_vv[j]);               
                }//for

                while (((i + 1) < len) && (nums[i + 1] == nums[i]))
                {
                    i++;
                    iter++;
                }

            }//for
        }//else
        return vv;
    }
};

GitHub测试程序源码

LeetCode(18)4Sum

标签:

原文地址:http://blog.csdn.net/fly_yr/article/details/47360849

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!