leetcode 39 Combination Sum

来源:互联网 发布:spring mysql 主从 编辑:程序博客网 时间:2024/06/18 01:24

Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

The same repeated number may be chosen from C unlimited number of times.

Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7] and target 7,
A solution set is:
[
[7],
[2, 2, 3]
]

class Solution {public:    typedef vector<int>::iterator It;    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {        vector<vector<int> > ret;        sort(candidates.begin(), candidates.end());        vector<int> ans;        combine(candidates.begin(), candidates.end(), target, ans, ret);        return ret;    }private:    void combine(It begin, It end, int target,             vector<int>& ans, vector<vector<int> >& ret){        for (It it = begin; it != end; ++it) {            vector<int> tmp(ans);            int val = *it;            if (val < target) {                tmp.push_back(val);                combine(it, end, target - val, tmp, ret);            } else if (val == target) {                tmp.push_back(val);                ret.push_back(tmp);                return; // 后面的都更大,所以返回            } else { // val > target                  return;            }         }    }}; // about 50%

参考后
快很多

class Solution {public:    typedef vector<int>::iterator It;    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {        vector<vector<int> > ret;        sort(candidates.begin(), candidates.end());        vector<int> ans;        combine(candidates.begin(), candidates.end(), target, ans, ret);        return ret;    }private:    void combine(It begin, It end, int target,             vector<int>& ans, vector<vector<int> >& ret){        for (It it = begin; it != end; ++it) {            int val = *it;            if (val < target) {                ans.push_back(val);                combine(it, end, target - val, ans, ret);                ans.pop_back();            } else if (val == target) {                ans.push_back(val);                ret.push_back(ans);                ans.pop_back();                return; // 后面的都更大,所以返回            } else { // val > target                  return;            }            }    }}; // about 75%
原创粉丝点击