首页 > 其他分享 >LeetCode ● 216.组合总和III ● 17.电话号码的字母组合

LeetCode ● 216.组合总和III ● 17.电话号码的字母组合

时间:2023-02-24 15:25:47浏览次数:36  
标签:216 digits 17 int 个数 num 字母组合 new public

LeetCode 216.组合总和III

分析1.0

回溯问题 组合总和sum == n 时以及path中元素个数 == k 时,res.add(new path)

返回后递归删除掉当前值

class Solution {

    public List<List<Integer>> res = new ArrayList();
    public LinkedList<Integer> path = new LinkedList();

    public List<List<Integer>> combinationSum3(int k, int n) {
        backTracking(k, n, 1, 0, 0);
        return res;
    }
    public void backTracking(int k, int n, int start, int sum, int cnt){
        if(sum == n && cnt == k){
            res.add(new LinkedList(path));
            return;
        }
        for(int i = start; i <= 9; i++){
            path.add(i);
            sum+=i;
            cnt++;
            backTracking(k, n, i+1, sum, cnt);
            sum-=i;
            cnt--;
            path.removeLast();
        }
    }
}

分析2.0

  1.  剪枝 已选元素总和如果已经大于n了,那么往后遍历就没有意义了,直接剪掉。
  2. path 元素个数可以由path.size()获取,并不用弄一个元素个数计数器

LeetCode 17.电话号码的字母组合

分析1.0

这个题目有几个关键点:

  1. 字母间的组合依赖于输入数字,必然要建立数字同字母间的映射关系
  2. 数字个数决定了递归深度 数字个数计数器,而字母个数决定了回溯单层逻辑每层宽度 字母个数计数器
  3. 终止条件:当前字母组合长度 == 数字个数
  4. 回溯函数 void bk(输入数字组合,映射表,数字个数计数器)
class Solution {

    //设置全局列表存储最后的结果
    List<String> list = new ArrayList<>();

    public List<String> letterCombinations(String digits) {
        if (digits == null || digits.length() == 0) {
            return list;
        }
        //初始对应所有的数字,为了直接对应2-9,新增了两个无效的字符串""
        String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        //迭代处理
        backTracking(digits, numString, 0);
        return list;

    }

    //每次迭代获取一个字符串,所以会设计大量的字符串拼接,所以这里选择更为高效的 StringBuild
    StringBuilder temp = new StringBuilder();

    //比如digits如果为"23",num 为0,则str表示2对应的 abc
    public void backTracking(String digits, String[] numString, int num) {
        //遍历全部一次记录一次得到的字符串
        if (num == digits.length()) {
            list.add(temp.toString());
            return;
        }
        //str 表示当前num对应的字符串
        String str = numString[digits.charAt(num) - '0'];
        for (int i = 0; i < str.length(); i++) {
            temp.append(str.charAt(i));
            //c
            backTracking(digits, numString, num + 1);
            //剔除末尾的继续尝试
            temp.deleteCharAt(temp.length() - 1);
        }
    }
}

总结

  1. 写完代码看剪枝
  2. 确定 深度递归逻辑 横向递归逻辑 终止逻辑 递归参数 剪枝逻辑

标签:216,digits,17,int,个数,num,字母组合,new,public
From: https://www.cnblogs.com/cupxu/p/17140324.html

相关文章

  • P4442 [COCI2017-2018#3] Portal
    首先考虑传送门的作用,那就是使我能更快地走到终点,也就是跳过一段路经。那么既然这样,我们就在需要传送时先打传送门,然后找到一个墙打传送门再传送即可。很明显选择的墙即......
  • P4416 [COCI2017-2018#1] Plahte 题解
    题意简述:给定\(n\)个互不相交,可以重叠的矩阵,对某些点染色,这个点上的所有矩阵会被染上这个颜色,求最后每个矩阵会有多少种颜色。解:我们可以先把矩阵拆成上下两条水平线......
  • P2161 [SHOI2009]会场预约 题解
    没事打了个Splay,然后调了3h。觉得题解的找前驱后继与删除复杂了点,主要讲一下这的思路。由于平衡树中每一个点代表的区间互不相交,所有平衡树满足\(l,r\)两个值的BST。......
  • P1763 埃及分数 题解
    做完后发现很多题解都是有些细节问题的,对于向上与向下取整非常混乱。第一次做迭代加深搜索的题,记录一下。所谓迭代加深搜索,就是在求搜索树的深度的问题中,枚举层数,取最优......
  • 2017GPLT
    PTA天梯赛2017GPLT7-6整除光棍给定一个不以5结尾的奇数\(x\),求出数字\(n\)使得\(n*x=11...111\),输出数字n和1的位数题解:模拟竖式除法我们一开始发现n只要一直往后*......
  • 新项目决定用 JDK 17了
    转自 大家好,我是风筝。公众号「古时的风筝」,专注于后端技术,尤其是Java及周边生态。文章会收录在JavaNewBee中,更有Java后端知识图谱,从小白到大牛要走的路都在里面......
  • POJ1737 连通图
    一句话题意:求一个\(n\)点带编号的连通图数量。吐槽一下:好好一道计数dp为什么不加取余????逼着选手写高精度的出题人应该拎出去烧……哦楼天城是出题人是吧哦当我没说我什......
  • 117、商城业务---分布式事务---RabbitMQ延时队列
    1、定时任务存在的问题即任务过期时间为30min,任务在第31min过期,但是在第60分钟才被扫描到2、延时队列是先设置一个过期队列,里面消息过期后不会丢弃而是通过交换机放......
  • 17.多维数组
    多维数组1.一维数组int[]arr1={1,2,3};System.out.println(arr1[0]);2.二维数组//[4][2],四行二列/*1,1arr2[0]2,2arr2[1]3,3arr2[2]......
  • Parallels Desktop 17 安装教程附下载地址
    1、首先安装ParallelsDesktop17,双击打开下载的ParallelsDesktop17dmg安装文件,双击“安装ParallelsDesktop.app”2、弹出提示“安装ParallelsDesktop.app”是......