首页 > 其他分享 >代码随想录|回溯part 01

代码随想录|回溯part 01

时间:2024-10-20 13:18:45浏览次数:3  
标签:index 01 return int res 随想录 part path backtracking

存在于递归函数的下方,递归与回溯相辅相成
回溯搜索法:暴力算法
适用范围:
• 组合问题:N个数里面按一定规则找出k个数的集合(无序)
• 切割问题:一个字符串按一定规则有几种切割方式
• 子集问题:一个N个数的集合里有多少符合条件的子集
• 排列问题:N个数按一定规则全排列,有几种排列方式(有序)
• 棋盘问题:N皇后,解数独等等 

理解:
1、将回溯抽象为高度有限的n叉树
宽度为集合大小,利用for循环遍历
深度为递归深度,利用递归,有终止条件

模板:
void backtracking(参数)
{
	If(终止条件){
		收集结果;
		return;
	}
	//单层搜索
	for(集合元素)
	{
		处理元素节点;
		Backtracking()递归函数;
		回溯操作;
	}
	return;
}

77.组合
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。

要点:1、利用path储存单条路径,res储存所有路径
2、当path.size()==k时,说明满足k个数的条件,返回
3、集合中元素为1~n,利用for循环遍历
剪枝优化:判断i在循环遍历中可取的最大值
在该题中,i<=n-(k-path.size())+1
4、将节点元素放入path中
5、进行递归
6、回溯
class Solution {
public:
    vector<int>path;
    vector<vector<int>>res;
    void backtracking(int n,int k,int startindex)
    {
        if(path.size()==k)
        {
            res.push_back(path);
            return ;
        }
        for(int i=startindex;i<=n;i++)
        {
            path.push_back(i);
            backtracking(n,k,i+1);
            path.pop_back();
        }
        return;
    }
    vector<vector<int>> combine(int n, int k) {
        backtracking(n,k,1);
        return res;
    }
};

216.组合总和
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
	• 只使用数字1到9
	• 每个数字 最多使用一次 
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

class Solution {
public:
    vector<int>path;
    vector<vector<int>>res;
    void backtracking(int n,int k,int sum,int index)
    {
        if(path.size()==k)
        {
            if(n==sum)res.push_back(path);
            return ;
        }
        for(int i=index;i<=9;i++)
        {
            sum+=i;
            if(sum>n)
            {
                sum-=i;
                return;
            }
            path.push_back(i);
            backtracking(n,k,sum,i+1);
            sum-=i;
            path.pop_back();
        }
        return;
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(n,k,0,1);
        return res;   
    }
};

17.电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母

要点:1、利用常量字符串实现数字到字母的映射
2、不同集合间的组合,运用index来记录处于哪一个集合,当index==digits.size()时说明index到了最后一个集合,应当结束返回

class Solution {
public:
    const string letter[10] = {
        "", // 0
        "", // 1
        "abc", // 2
        "def", // 3
        "ghi", // 4
        "jkl", // 5
        "mno", // 6
        "pqrs", // 7
        "tuv", // 8
        "wxyz", // 9
    };
    string s;
    vector<string> res;
    void backtracking(string digits,int index)//index指digits的位数
    {
        if(index==digits.size())
        {
            res.push_back(s);
            return ;
        }
        int t=digits[index]-'0';
        string k=letter[t];//取出对应字符集
        for(int i=0;i<k.size();i++)
        {
            s.push_back(k[i]);
            backtracking(digits,index+1);
            s.pop_back();
        }
        return;
    }
    vector<string> letterCombinations(string digits) {
        if(digits.size()==0)//判断是否为空
        {
            res.clear();
            return res;
        }
        backtracking(digits,0);
        return res;
    }
};

标签:index,01,return,int,res,随想录,part,path,backtracking
From: https://blog.csdn.net/Carolinian/article/details/143080695

相关文章

  • Mysql高级-day01
    Mysql高级-day01MySQL高级课程简介序号Day01Day02Day03Day041Linux系统安装MySQL体系结构应用优化MySQL常用工具2索引存储引擎查询缓存优化MySQL日志3视图优化SQL步骤内存管理及优化MySQL主从复制4存储过程和函数索引使用MySQL锁问题综......
  • P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III
    Sol蒲公英题意基本相同,但是注意到空间限制62.5MB,显然不能用蒲公英的做法。考虑先把整块的答案算出来,然后把小块的部分补上去,显然大块可以预处理,小块可以直接暴力查询是否越界。代码很简单。Code#include<iostream>#include<iomanip>#include<cstdio>#include<vector>......
  • 01背包、有依赖的背包
    01背包、有依赖的背包P1048[NOIP2005普及组]采药01背包(模版)给定一个正数t,表示背包的容量有m个货物,每个货物可以选择一次每个货物有自己的体积costs[i]和价值values[i]返回在不超过总容量的情况下,怎么挑选货物能达到价值最大返回最大的价值二维dp数组#incl......
  • 【题解】「COCI 2018」Teoretičar
    LinkofThisProblem根据Vizing定理,最小的答案就是二分图的最大度数。同时可以在\(O(nm)\)的时间复杂度内构造出一组解。显然对于这道题我们需要更高效的做法。注意到\(2\)的整数次幂,考虑分治。既然答案跟最大度数有关,如果我们每次能把边集分为两个集合,认为她们的颜色......
  • springboot养老监护管理系统-计算机毕业设计源码55018
    摘  要本课题的研究对象是基于SpringBoot+Vue的养老监护管理系统,该系统实现了系统用户(管理员、家属用户、养老员工、保卫员工、后勤人员)老人信息管理、分配病房管理、病历记录管理、访客记录管理、外出记录管理、来往登记管理等功能。本系统在设计上,考虑到系统内容以及系......
  • P2672 NOIP2015 普及组 推销员
    P2672[NOIP2015普及组]推销员-洛谷|计算机科学教育新生态(luogu.com.cn)我还是相信,大部分人是想不出贪心的。时间复杂度\(O(n\logn)\)但是常数极大,运用线段树,这题数据过水,甚至我一个写错了的线段树都能拿满(除了#3hack)。非贪心。首先按距离大小分类,并在每一类里进行......
  • 二维数组1019
    publicclassPlaceDemo{publicstaticvoidmain(String[]args){//班级学生座位(二维数组)place();pace();}publicstaticvoidplace(){//静态初始化数组-----数据类型[][]数组名=new数据类型[]{元素1,元素2,元素3,··......
  • 数组练习1018
    假设班级有8名学生,录入8名学生的java成绩,成绩类型是小数,并输出平均分,最高分,最低分publicclassClassDemo2{publicstaticvoidmain(String[]args){//假设班级有8名学生,录入8名学生的java成绩,成绩类型是小数,并输出平均分,最高分,最低分studentSc......
  • Task01:课程简介、安装Installation
    标题:PyCharm安装流程详解摘要:本文详细介绍了在不同操作系统下安装PyCharm的步骤,包括软件的下载、安装过程中的各项设置以及可能遇到的问题和解决方法,旨在为Python开发者提供一个全面且清晰的PyCharm安装指南。一、引言PyCharm是一款由JetBrains开发的功能强大......
  • 代码随想录算法训练营day20| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树
    学习资料:https://programmercarl.com/0669.修剪二叉搜索树.html#算法公开课学习记录:669.修剪二叉搜索树(直接在原函数上操作,要根据情况用root的左右子树递归,因为子树中有满足条件的;前序:根左右)点击查看代码#Definitionforabinarytreenode.#classTreeNode:#def_......