深度优先搜索DFS + 剪枝 | 回溯:力扣39. 组合总和

1、题目描述:

深度优先搜索DFS + 剪枝 | 回溯:力扣39. 组合总和_第1张图片
深度优先搜索DFS + 剪枝 | 回溯:力扣39. 组合总和_第2张图片

2、题解:

方法:深度优先搜索DFS + 剪枝,+回溯
也是可以套用回溯模板:

对于dfs函数 ,传进来三个值,路径path,路径里的和sum_,枚举选择的起点start:
    如果sum_ > target:剪枝
    如果sum_ == target:满足条件添加进结果数组res中
    循环,从start开始做枚举:(因为可以重复,所以从start开始,且向下选择的时候i值不改变;并且因为每次都是从start开始往后遍历,所以可以去除[2,2,3],[2,3,2]这种重复情况)
        做选择
        向下选择
        撤销选择
调用的时候,path赋空数组[],sum_一开始是0,起点start为0(start是下标)

Python实现:

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        #DFS,回溯
        def dfs(path,sum_,start): #start是枚举选择的起点 path是当前构建的路径(组合)
            if sum_ > target: #剪枝
                return
            if sum_ == target: #满足条件,保存
                res.append(path[:])
                return 
            for i in range(start,n): #枚举
                path.append(candidates[i]) #选择
                dfs(path,sum_ + candidates[i],i) #向下继续选择
                path.pop()		#选择           
        res = []
        n = len(candidates)
        dfs([],0,0)
        return res

C++实现:

class Solution {
public:
    void dfs(vector<int> path,int sum,int start,vector<vector<int>>& res,int& target,vector<int>& candidates){
        if (sum > target)
            return; 
        if (sum == target){
            res.push_back(path);
            return;
        }
        for (int i = start;i < candidates.size();i++){
            path.push_back(candidates[i]);
            dfs(path,sum + candidates[i],i,res,target,candidates);
            path.pop_back();
            if (sum > target)
                break;
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        // DFS,回溯
        vector<int> path;
        vector<vector<int>> res;
        dfs(path,0,0,res,target,candidates);
        return res;
    }
};

3、复杂度分析:

暂不做分析

你可能感兴趣的:(LeetCode高频面试题)