首页 > 其他分享 >Day 19 回溯法part01| LeetCode 77.组合,216. 组合总和 III,17. 电话号码的字母组合

Day 19 回溯法part01| LeetCode 77.组合,216. 组合总和 III,17. 电话号码的字母组合

时间:2024-09-18 23:15:16浏览次数:10  
标签:216 return 组合 int List result 字母组合 new public

理论基础

  • 回溯法(回溯搜索法)

    • 回溯函数就是递归函数
    • 本质是穷举
    • 解决的问题
      • 组合问题(不强调元素顺序,需去重)
      • 切割问题
      • 子集问题:一个N个数的集合里有多少符合条件的子集
      • 排列问题(强调元素顺序)
      • 棋盘问题:N皇后
  • 回溯法模板(可抽象为树形结构——N叉树 来解决问题)

    • 递归返回值以及参数(一般为void)
    • 终止条件
    • 回溯搜索的遍历过程
    void backtracking(参数){
        if(终止条件){
            存放结果;
            return;
        }
        for(选择:本层集合中元素(树中结点孩子的数量就是集合的大小))
        {
            处理节点;
           backtracking(路径,选择列表);//递归
            回溯,撤销处理结果
        }
       }
        
    

77.组合

77. 组合

class Solution {
        public List<List<Integer>> result =new ArrayList<>();//二维
        public List<Integer> path=new LinkedList<>();//一维

            public List<List<Integer>> combine(int n, int k) {
                backtracking(n,k,1);
                return result;
            }

        void backtracking(int n ,int k,int startIndex)//n为传入的集合大小
        {
            if(path.size()==k)//终止条件:树形结构的叶子节点
                {
                   result.add(new ArrayList<>(path));
                   return;
                }
                //单层搜索递归逻辑
            for(int i=startIndex;i<=n;i++)
            {
                 path.add(i);
                backtracking(n,k,i+1);
                int size=path.size();
                path.remove(size-1);

            }
        }

    }

减枝操作

class Solution {
        public List<List<Integer>> result =new ArrayList<>();//二维
        public List<Integer> path=new LinkedList<>();//一维

        public List<List<Integer>> combine(int n, int k) {
            backtracking(n,k,1);
            return result;
        }

        void backtracking(int n ,int k,int startIndex)//n为传入的集合大小
        {
            if(path.size()==k)//终止条件:树形结构的叶子节点
            {
                result.add(new ArrayList<>(path));
                return;
            }
            //单层搜索递归逻辑
            //至多从哪开始
            for(int i=startIndex;i<=n-(k-path.size())+1;i++)
            {
                path.add(i);
                backtracking(n,k,i+1);
                int size=path.size();
                path.remove(size-1);

            }
        }

    }

216. 组合总和 III

216. 组合总和 III

class Solution {
        public List<List<Integer>> result =new ArrayList<>();//二维
        public List<Integer> path=new LinkedList<>();//一维

        public List<List<Integer>> combinationSum3(int k, int n) {
                backtracking(9,k,1,n);
                return result;
            }

        void backtracking(int n ,int k,int startIndex,int Sum)//n为传入的集合大小
        {
            int sum=0;
            for(int i=0;i<path.size();i++)
            {
                sum+=path.get(i);
            }
            if(sum==Sum&&path.size()==k)//终止条件:树形结构的叶子节点
                {
                   result.add(new ArrayList<>(path));
                   return;
                }
                //单层搜索递归逻辑
            for(int i=startIndex;i<=n;i++)
            {
                 path.add(i);
                backtracking(n,k,i+1,Sum);
                int size=path.size();
                path.remove(size-1);

            }
        }

    }

剪枝

class Solution {
        public List<List<Integer>> result =new ArrayList<>();//二维
        public List<Integer> path=new LinkedList<>();//一维

        public List<List<Integer>> combinationSum3(int k, int n) {
                backtracking(9,k,1,n);
                return result;
            }

        void backtracking(int n ,int k,int startIndex,int Sum)//n为传入的集合大小
        {
            int sum=0;
            
            for(int i=0;i<path.size();i++)
            {
                sum+=path.get(i);
            }
            if(sum>Sum) return;//剪枝
            if(sum==Sum&&path.size()==k)//终止条件:树形结构的叶子节点
                {
                   result.add(new ArrayList<>(path));
                   return;
                }
                //单层搜索递归逻辑
            for(int i=startIndex;i<=n-(k-path.size())+1;i++)
            {
                 path.add(i);
                backtracking(n,k,i+1,Sum);
                int size=path.size();
                path.remove(size-1);

            }
        }

    }

17. 电话号码的字母组合

17. 电话号码的字母组合

 class Solution {

     StringBuilder path=new StringBuilder();
        List<String> result=new ArrayList<>();
        String[] letterMap={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        public List<String> letterCombinations(String digits) {

            if(digits==null|| digits.length()==0)
                return result;

            //映射

            //树的深度取决于digits里数字的个数
            //树的宽度取决于数字对应的字符串长度

            backtracking(digits,0);
            return result;

        }
        void backtracking(String digits,int Index)
        {
            if(Index==digits.length())
            {
               result.add(path.toString());
                return ;
            }

            int digit=(digits.charAt(Index)-'0');
            String letter=letterMap[digit];
            for(int i=0;i<letter.length();i++)
            {

                path.append(letter.charAt(i));
                backtracking(digits,Index+1);
                path.deleteCharAt(path.length()-1);
            }



        }
    }

标签:216,return,组合,int,List,result,字母组合,new,public
From: https://www.cnblogs.com/FreeDrama/p/18419542

相关文章

  • P2163 [SHOI2007] 园丁的烦恼
    中学的时候年轻气盛,应该拿主席树把这道题艹过去了。正好复习离线二维数点,再做了一遍。我们把询问差分安排到x轴上,然后y轴用树状数组统计即可。注意到此题要离散化,但是询问中的x可能不在原序列中。不过这不要紧,记得二分完减一就好。constintN=5e5+5,S=1e7+5;intn,m......
  • 代码随想录算法训练营,9月18日 | 77.组合,216.组合总和III,17.电话号码的字母组合
    回溯算法理论基础:1.回溯是递归的副产品,有递归就有回溯。2.回溯的本质是穷举,想让回溯法高效些,可以加一些剪枝的操作3.组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按......
  • 【逐行解析】PSINS工具箱中的UKF组合导航的代码解析(test_SINS_GPS_UKF_153)
    详解工具箱的UKF153代码,最后给出运行结果的解读和代码修改思路文章目录工具箱程序简述函数详解运行结果解读修改思路修改后的结果工具箱本程序需要在安装工具箱后使用,工具箱是开源的,链接:http://www.psins.org.cn/kydm程序简述程序实现基于UKF(无迹卡尔曼滤波)的SI......
  • 一个线性筛的多功能组合:筛法求质数+约数个数+约数和
    F:\BC\2024\9>main1活动代码页:9362 2X2=43 3X2=6 3X3=94X2=85 5X2=10 5X3=15 5X5=256X2=127 7X2=14 7X3=21 7X5=35 7X7=498X2=169X2=18 9X3=2710X2=2011 11X2=22 11X3=33 11X5=55 11X7=77 11X11=12112X2=2413 13X2=26 13X......
  • 组合模式
    组合模式组合模式(CompositePattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次关系。它允许客户端以统一的方式处理单个对象和对象集合,使得客户端不需要区分具体的对象类型,从而简化了代码的处理逻辑。主要组成部分Component(组件):定义了叶子对象和......
  • VUE3组合API中跨层数据传递 provide和inject
    1.provide顶层组件通过该函数提供数据2.inject底层组件通过该函数获得数据、        示例:                目的:数据从底层传到顶层底层:创建一个底层dowen.vue文件<scriptsetup>import{inject}from'vue';constvueData=inject('data-ke......
  • 【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)
    [USACO1.5][IOI1994]数字三角形NumberTriangles题目描述观察下面的数字金字塔。写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。在上面的样例中,从的路径产生了最大权值。输入格式第一个行一个正整数......
  • C++【全特化】【半特化】【继承方式权限】【继承使用】【菱形继承的探究】【组合与继
    目录类模板的特化全特化偏特化特化部分参数对参数类型进行一定的限制关于*&的讨论特化的优先级类模板的声明和定义分离​编辑继承初学继承概念理解继承方式继承权限继承切割与切片继承的作用域继承的默认构造成员函数继承的默认构造继承的拷贝构造继承的赋......
  • 2023年全国高中数学联合竞赛A卷加试P3:组合极值、染色
    题目求具有下述性质的最小正整数$k$:若将$1,2,\cdots,k$中的每个数任意染为红色或者蓝色,则或者存在$9$个不同的红色的数$x_1,x_2,\cdots,x_9$满足$x_1+x_2+\cdots+x_8<x_9,$或者存在$10$个互不相同的蓝色的数$y_1,y_2,\cdots,y_{10}$满足$y_1+y_2+\cdots+y_9<y_{10}.$解......
  • 小众创新组合!LightGBM+BO-Transformer-LSTM多变量回归交通流量预测(Matlab)
    小众创新组合!LightGBM+BO-Transformer-LSTM多变量回归交通流量预测(Matlab)目录小众创新组合!LightGBM+BO-Transformer-LSTM多变量回归交通流量预测(Matlab)效果一览基本介绍程序设计参考资料效果一览基本介绍1.Matlab实现LightGBM+BO-Transformer-LSTM多变量回归预测,LightGBM+BO-......