首页 > 编程语言 >【LeetCode回溯算法#02】组合总和III

【LeetCode回溯算法#02】组合总和III

时间:2023-03-07 22:37:12浏览次数:57  
标签:02 beginIndex target int res vector path III LeetCode

组合总和III

力扣题目链接(opens new window)

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

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

示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]

示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]

思路

组合问题的思路类似,只是条件变了而已

直接上三部曲分析

1、确定递归函数的参数和返回值

这里仍然不需要返回值,因为我们是去操作一个"数组"

参数就是组合的元素个数k,目标相加和target以及控制遍历位置的beginIndex

依然需要两个数组来保存结果

class Solution {
private:
    vector<int> path;
    vector<vector<int>> res;
    //确定递归函数的参数和返回值
    void backtracking(int k, int target, int beginIndex){
        
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        
    }
};

2、确定终止条件

当遍历到叶子节点时触发终止条件,并判断此时target是否被减为0(这里找符合条件的元素和是通过减法来进行的,详见两数之和

这里刚开始做容易乱,强调一下,在这个回溯模板中,终止条件一般就是深度,即path大小与k是否相等,相等就终止

(我做的时候还把target == 0也作为条件一块加上了,实际上是错误的,这个条件对应是否要保存当前path)

class Solution {
private:
    vector<int> path;
    vector<vector<int>> res;
    //确定递归函数的参数和返回值
    void backtracking(int k, int target, int beginIndex){
        //终止条件
        if(path.size() == k){//是否遍历到叶子节点
            if(target == 0){
                res.push_back(path);
                return;
            }
        }
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {

    }
};

3、确定单层处理逻辑

在每层递归中,遍历规定范围内的值,用来与target作差,并保存当前遍历到的路径值

然后触发递归

在回溯过程中,将减掉的值再加回target,并pop掉path中保存的路径值

class Solution {
private:
    vector<int> path;
    vector<vector<int>> res;
    //确定递归函数的参数和返回值
    void backtracking(int k, int target, int beginIndex){
        //终止条件
        if(path.size() == k){//是否遍历到叶子节点
            if(target == 0){//若target为0,则当前path中保存的路径值之和满足为n的条件
                res.push_back(path);
                return;
            }
        }
        //确定单层处理逻辑
        for(int i = beginIndex; i <= 9; ++i){
            target -= i;//当前路径值与target作差
            path.push_back(i);//保存当前路径值
            backtracking(k, target, i + 1);//触发下层递归,跳过当前值
            //回溯逻辑处理
            target += i;
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        
    }
};

代码

class Solution {
private:
    vector<int> path;
    vector<vector<int>> res;
    //确定递归函数的参数和返回值
    void backtracking(int k, int target, int beginIndex){
        //终止条件
        if(path.size() == k){//是否遍历到叶子节点
            if(target == 0){//若target为0,则当前path中保存的路径值之和满足为n的条件
                res.push_back(path);
                return;
            }
        }
        //确定单层处理逻辑
        for(int i = beginIndex; i <= 9; ++i){
            target -= i;//当前路径值与target作差
            path.push_back(i);//保存当前路径值
            backtracking(k, target, i + 1);//触发下层递归,跳过当前值
            //回溯逻辑处理
            target += i;
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(k, n, 1);
        return res;
    }
};

标签:02,beginIndex,target,int,res,vector,path,III,LeetCode
From: https://www.cnblogs.com/DAYceng/p/17189956.html

相关文章

  • 2022.3.7学习总结
    按照我们敬爱的建民老师的要求,我对我的UI交互界面做了一些优化,包括两个方面,首先是按钮的风格,接着又解决了标题栏的问题。 由于能力有限,暂时设计不出更加漂亮的标题栏,于......
  • 2023爬虫学习笔记 -- m3u8视频下载
    一、目标地址https://www.XXXX.com/二、获取mu38文件1、点击XHR,刷新页面,会看到这里有两个m3u8文件2、将m3u8地址复制到浏览器,会自动下载下来,index内容如下mixed内容如下3、......
  • Leetcode69(牛顿迭代)
    给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去。注意:不允许使用任何内置指数函数和算符,例如 ......
  • 2023年3月7日(软件工程日报)
    今天开始分两方面,一方面学习安卓新知识另一方面每天学习javaweb相关知识,主要感觉自己上学期javaweb只学习了一些皮毛,需要深入理解一下。今天主要内容为相关控件的内容,ui......
  • 山东csp-j2022 试题答案及视频讲解
    山东csp-j2022试题答案及视频讲解T319771植树节(planting)山东CSP-J2022入门组1题目链接:https://www.luogu.com.cn/problem/T319771题目讲解:#include<iostream>#inc......
  • 2022虚拟人应用与实践报告
    导读:原文《2022虚拟人应用与实践报告》,本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考          ......
  • 【LeetCode回溯算法#01】图解组合问题
    组合问题力扣题目链接(opensnewwindow)给定两个整数n和k,返回范围[1,n]中所有可能的k个数的组合。示例:输入:n=4,k=2输出:[[2,4],[3,4],[2,3],[1......
  • 2023.3.7每日总结
    今天学习了获取系统时间并且使用DatePicker标签自由选择时间<DatePickerandroid:layout_margin="10dp"android:id="@+id/select_time"and......
  • 2023.3.7
    最近过的好艰难。从研究生上岸到研一上学期,再到今天,回学校快一个月了。想着去实习,老师也同意了。老师的要求其实很低,会调参就行,具体做下来,真的好难,keras没学过,word2vec文章......
  • 2023.3.7
    其实是3.4那天的模拟赛,那天打的挺崩溃来着,但是后来停电了(就很乐),于是比赛没打完,然后一直没来电就提前放学了捏。今天重赛了,来写写。T1P1169[ZJOI2007]棋盘制作传送门......