LeetCode(39) Combination Sum

将解决这个问题的整个过程记录下来:
1、首先我以[2,3,6,7,9] 9为例研究了一下可行解,在小规模情况下目测可行解为
[[9], [2,7],[3,6]],我就想如何按照某种规则来搜索出这些可行解呢,此时我想到用于找零问题的贪婪算法,将可行解集合按照贪婪算法重新整理为,[9],[7,2],[6,3]。
2、此时开始想到排列树,编程之美3.2节,发现在排列树上进行贪婪算法是可行的。


3、接下来就是实现算法了,开始写深度优先搜索代码。
4、摸索性的写,后来慢慢发现应该再定义一个函数,而现在写的地方属于驱动函数的部分。
5、开始写用于递归的函数
6、用小规模例子试运行,修正程序的不精确地方(打磨)
7、成功。

class Solution {
public:

    void dfsSearch(vector<int> &candidates, int serialNumber, vector<int> &combinationIndex, int depth, int target, vector<vector<int>> &result) {

        for(int i = serialNumber; i < candidates.size(); i++) {

                combinationIndex[depth] = i;

                if(target - candidates[i] > 0)

                    dfsSearch(candidates, i, combinationIndex, depth + 1, target - candidates[i], result);

                if(target - candidates[i] == 0) {

                    vector<int> tmp;
                    for(int j = 0; j <= depth; j++)

                        tmp.push_back(candidates[combinationIndex[j]]);

                    reverse(tmp.begin(), tmp.end());    
                    result.push_back(tmp);
                    continue;

                }

                if(target - candidates[i] < 0)

                    continue;

            }

    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {

        sort(candidates.begin(), candidates.end());
        reverse(candidates.begin(), candidates.end());

        vector<vector<int>> result;
        int depth = 0;
        vector<int> combinationIndex(1000, -1);
        int serialNumber = 0;
        dfsSearch(candidates, serialNumber, combinationIndex, depth, target, result);

        reverse(result.begin(), result.end());   
        return result;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值