[LeetCode] Combination Sum

来源:互联网 发布:php购物系统源码 编辑:程序博客网 时间:2024/05/17 23:15

Given a set of candidate numbers (C) 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.
  • Elements in a combination (a1a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
  • 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] 

解题用了深度优先遍历,并用一个vector模拟了一个出入栈的操作,涉及algorithm中sort和unique的用法。需要注意出入栈的时机。像这种递归中再使用循环(int i = curIdx;)的场景是一种题型,需要举一反三。

class Solution {public:    vector<vector<int> > combinationSum(vector<int> &candidates, int target) {    vector<vector<int> > rslt;    vector<int> curRslt;    if (0 == candidates.size())    {    return rslt;    }    sort(candidates.begin(), candidates.end());    vector<int>::iterator pos = unique(candidates.begin(),candidates.end());    candidates.erase(pos, candidates.end());    DFS(0, 0, target, curRslt, candidates, rslt);    return rslt;            }private:    void DFS(int curSum, int curIdx, int target, vector<int> &curRslt, vector<int> &candicates, vector<vector<int> > &rslt)    {    if (curSum > target)return;    if (curSum == target)    {    rslt.push_back(curRslt);    return;    }        for (int i = curIdx; i < candicates.size() && curSum+candicates[i] <= target; i++)    {    curRslt.push_back(candicates[i]);    curSum += candicates[i];     DFS(curSum, i, target, curRslt, candicates, rslt);//本次i=0,进入递归i仍为0,比如2 3 6 7,t=7,223=7    curSum -= candicates[i];//每次递归跑到头后,都要退栈    curRslt.pop_back();    }    }};





0 0
原创粉丝点击