zoukankan      html  css  js  c++  java
  • 【LeetCode-回溯】组合总和

    题目描述

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
    candidates 中的数字可以无限制重复被选取。
    说明:

    • 所有数字(包括 target)都是正整数。
    • 解集不能包含重复的组合。

    示例:

    输入: candidates = [2,3,6,7], target = 7,
    所求解集为:
    [
      [7],
      [2,2,3]
    ]
    
    输入: candidates = [2,3,5], target = 8,
    所求解集为:
    [
      [2,2,2,2],
      [2,3,3],
      [3,5]
    ]
    

    题目链接: https://leetcode-cn.com/problems/combination-sum/

    思路

    使用回溯来做,使用变量curSum来记录当前的和,如果curSum==target则将当前的数字加入到答案中,因为candidates中的数字全为整数,所以如果curSum>target的话,可以直接return(剪枝)。又因为每个元素可以被重复选择多次,所以每次都从变量start开始遍历数组candidates,并将start初始化为0.代码如下:

    class Solution {
    public:
        vector<vector<int>> ans;
        vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
            if(candidates.empty() || target<=0) return {{}};
    
            vector<int> track;
            int curSum = 0;
            dfs(candidates, 0, curSum, target, track);
            return ans;
        }
    
        void dfs(vector<int>& candidates, int start, int curSum, int target, vector<int> track){
            if(curSum==target){
                ans.push_back(track);
                return;
            }
            if(curSum>target) return;
    
            for(int i=start; i<candidates.size(); i++){
                track.push_back(candidates[i]);
                curSum += candidates[i];
                dfs(candidates, i, curSum, target, track);
                track.pop_back();
                curSum -= candidates[i];
            }
        }
    };
    

    如果不设置start变量,每次递归都从0开始就会产生重复的结果,例如([2,3,6,7], 7)会产生[2,2,3],[2,3,2],[3,2,2],[7]四个结果,第2和第3个结果与第1个结果是重复的,重复的原因是遍历到3的时候,考虑了3之前的变量2。通过设置start变量,每次循环都从start变量开始,不再考虑start之前的变量,避免了重复。

  • 相关阅读:
    EF单实对应多表
    阻止保存要求重新创建表的更改
    Jenkins 修改主目录正解 workspace
    JNLP文件具体说明编辑
    Jenkins新建节点,启动方式没有“通过Java Web启动代理”选项怎么办?
    Entity Framework:“无法加载指定的元数据资源
    Java环境路径配置--转载
    趣谈StateServer在Web Garden,Web Farm下的使用
    【译文】漫谈ASP.NET中的Session
    好记心不如烂笔头之JQuery学习,第四章
  • 原文地址:https://www.cnblogs.com/flix/p/12773361.html
Copyright © 2011-2022 走看看