考察知识点:回溯

题目分析:

要想清楚三点:

1. 怎样处理结果会是升序的。

2. 可以不断的选取同一个元素,这该如何进行递归

3. 如何避免多个组合里元素及元素个数相同但顺序不同的情况,这种情况应该是同一种组合,不能加入到结果中。

首先,优选条件是数值较小的先选,那么由于原数组可能是无序的,我们可以将数组按照升序排序。这样数组的循序恰好就满足优选条件。

那么,既然我们的结果是升序的,也就是说先选取的数比较小,后面的数一定大于等于这个数。发现在选取元素遍历数组时可以控制遍历的起点。如果我们选取了第i个数,下一层遍历时也从第i个数开始,那么就可以选取同一个元素,并且保证了左边的数始终小于等于右边。

发现其实结果中的各个数组也是一个升序的数组,这就保证了加入到结果集中的组合的唯一性。

所用编程语言:C++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param candidates int整型vector 
     * @param target int整型 
     * @return int整型vector<vector<>>
     */
    
    void dfs(vector<int> &candidates, int start, int target, vector<int> &combination, vector<vector<int>> &res) {
        if (target == 0) {
            res.push_back(combination);
            return;
        }
        if (target < 0) return;
        int size = candidates.size();
        for (int i = start; i < size; i++) {
            combination.push_back(candidates[i]);
            dfs(candidates, i, target - candidates[i], combination, res);
            combination.pop_back();
        }
    }
    vector<vector<int> > cowCombinationSum(vector<int>& candidates, int target) {
        // write code here
        sort(candidates.begin(), candidates.end());
        vector<vector<int>> res;
        vector<int> conbination;
        dfs(candidates, 0, target, conbination, res);
        return res;
    }
};