代码随想录算法训练营第二十四天| 回溯算法

Posted by Zhuoqun on February 6, 2023

77. 组合

这道题跟着Carl视频做下来的。原理是懂了,但看视频的时候没太仔细看,我原以为是要把path也传递下去,其实是不用的。需要传递的三个参数是数组长度、取数range和目前所取数的index。另外,要注意for loop里i需要小于等于n,因为如果不加上等于的话,假如取值区间是1-4,就不会有4加入到数组里。

这道题虽然不难,还是很重要,需要多做几遍。

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(int n, int k, int startIndex){
        if(path.size() == k){
            result.push_back(path);
            return ;
        }
        for(int i=startIndex; i<=n; i++){
            path.push_back(i);
            backtracking(n,k,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtracking(n,k,1);
        return result;
    }
};

这道题是可以进行优化的,在Carl的下个视频里讲了这么优化(或者叫剪枝),就是把for loop里的range做了限制。从i<=n改成了i <= n - (k - path.size()) + 1,因为在某些情况下,没有可选的数了,就没必要再继续运行了。