Combination Sum

標(biāo)簽: C++ 算法 LeetCode 數(shù)組 DFS

每日算法——leetcode系列


問(wèn)題 Combination Sum

Difficulty: Medium

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 (a1, a2, … , 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]
class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        
    }
};

翻譯

和的組合

難度系數(shù):中等

給定一個(gè)一些數(shù)組成的候選集合C,和一個(gè)目標(biāo)數(shù)T。現(xiàn)從C中選出一些數(shù),求所有不同的取數(shù)方案使其累加和恰好等于T。
C中的每個(gè)數(shù)都可以取若干次。
注意

  • 所有的數(shù)(包括目標(biāo)數(shù))都為正整數(shù)
  • 組合中的元素(a1, a2, … , ak) 不能為降序排列。(ie, a1 ≤ a2 >≤ … ≤ ak)
  • 不能有重復(fù)的組合方案
    例如:候選集合2,3,6,7 和目標(biāo)值7,
    答案為:
    [7] [2, 2, 3]

思路

此題有點(diǎn)像是錢(qián)的面值為1、5、10,然后用這些面值的錢(qián)組合成一個(gè)特定的數(shù)。
不考慮加和加起來(lái)大于Int_Max的情況。
由于每個(gè)數(shù)可以重復(fù),可于抽象成樹(shù),root結(jié)節(jié)點(diǎn)有候選集合的總個(gè)數(shù)個(gè)子節(jié)點(diǎn),其中每個(gè)子節(jié)點(diǎn)的子節(jié)點(diǎn)是子節(jié)點(diǎn)本身,重復(fù)下去。
以候選集合2,3,6,7為例
root節(jié)點(diǎn)往下,有節(jié)點(diǎn)2,3,6,7,從左取2這個(gè)節(jié)點(diǎn)push進(jìn)vector<int>,每push一次將目標(biāo)值減去取的節(jié)點(diǎn)值,如果剩余的值大于0,繼續(xù)取,按深度優(yōu)先取,2的子節(jié)點(diǎn)還是2,···
還是畫(huà)圖比較清晰,找到好的畫(huà)圈工具再加上

代碼

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        len = static_cast<int>(candidates.size());
        temAndidates = candidates;
        vector<int> combination;
        dfs(combination, target, 0);
        return result;
    }
    
private:
    int len;
    vector<int> temAndidates;
    vector<vector<int> > result;
    
    void dfs(vector<int>& combination, int remainder,  int tempLen){
        if (tempLen >= len) {
            return;
        }
        if (remainder == 0){
            result.push_back(combination);
            return;
        } else {
            for (int i = tempLen; i < len; ++i) {
                if (remainder < temAndidates[i]){
                    return;
                }
                combination.push_back(temAndidates[i]);
                dfs(combination, remainder - temAndidates[i], i);
                combination.pop_back();
            }
        }
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容