法day25 | 回溯:组合问题、电话号码字母组合

1.216. 组合总和 III

1.1 链接

https://leetcode.cn/problems/combination-sum-iii

1.2 关键知识点

1.3 自己遇到的细节问题

  • 注意这里n是和了。。 而不是之前的数组中数字数量,需要注意看参数

1.4 题解

class Solution {
     List<List<Integer>> rs = new ArrayList<>();
     LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        if(k == 0 || n == 0){return rs;}
        backTracking(k , n, 1, 0);
        return rs;
    }
    public void backTracking(int k , int n, int start, int sum){
        if(path.size() == k){
            if(sum == n){
                rs.add(new ArrayList<>(path));
            }
            return;
        }

        int remaining = k - path.size();// 剪枝操作1
        for(int i = start; i <= 9 - remaining + 1; i ++){//注意是<=,这里数字长度为9
            sum += i;
            path.add(i);
            if (sum > n) { // 剪枝操作2
                sum -= i;
                path.removeLast();  
                return;        
            }
            backTracking(k, n, i + 1, sum);
            sum -= i;
            path.removeLast();      
        }
    }
}

2.电话号码字母组合

2.1 链接

https://leetcode.cn/problems/letter-combinations-of-a-phone-number/

2.2 关键知识点

  • 每次for的宽度。在同一个集合求组合中,是每次for宽度递减,而在不同集合组合中,每次宽度是按照情况固定的
  • 参数的递增:思考一下第一次递归更新的条件应该是什么,例如这里是进入下一个letter映射中,而不是进入下一个字母,因此是letterIndex + 1

2.3 自己遇到的细节问题

  • StringBuider创建 StringBuilder path = new StringBuilder();转为String path.toString();
  • 加上append,去除.deleteCharAt(temp.length() - 1);
  • 定义数组应该是{}大括号

2.4 题解

class Solution {
    List<String> rs = new ArrayList<>();
    StringBuilder path = new StringBuilder();
    String[] dic = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    public List<String> letterCombinations(String digits) {
        if(digits.length() == 0){return rs;}
        backTracking(digits, 0);
        return rs;
    }
    public void backTracking(String digits, int letterIndex){
        if(letterIndex == digits.length()){//1.深度控制
            rs.add(path.toString());
            return;
        }

        char ch = digits.charAt(letterIndex);
        String letter = dic[ch - '0']; // 取数字对应的字符集

        for(int i = 0; i < letter.length(); i ++){ //2每次for的宽度。在同一个集合求组合中,是每次for宽度递减,而在不同集合组合中,每次宽度是按照情况固定的
            path.append(letter.charAt(i));
            backTracking(digits, letterIndex + 1);//3. 参数的递增:思考一下第一次递归更新的条件应该是什么,例如这里是进入下一个letter映射中,而不是进入下一个字母,因此是letterIndex + 1
            path.deleteCharAt(path.length() - 1);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值