代码随想录算法训练营 Day 25 | 216.组合总和III,17.电话号码的字母组合

文章介绍了如何使用回溯法来解决两个组合问题:找出所有可能的整数组合使得它们的和等于给定的目标值(组合总和III),以及根据电话号码的数字映射生成所有可能的字母组合。在Java中,通过递归的回溯函数实现这两个问题的解决方案。
摘要由CSDN通过智能技术生成

216.组合总和III

讲解链接:代码随想录-216.组合总和III

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


void backtracking(int k, int n, int startIndex, List<Integer> paths, List<List<Integer>> result) {
    int sum = 0;
    for (int i = 0; i < paths.size(); i++) {
        sum += paths.get(i);
    }
    if (paths.size() == k) {
        if (sum == n) {
            result.add(new ArrayList<>(paths));
        }
        return;
    }
    for (int i = startIndex; i <= 9; i++) {
        if (n - sum < i) {
            return;
        }
        paths.add(i);
        backtracking(k, n, i + 1, paths, result);
        paths.remove(paths.size() - 1);
    }
}

17.电话号码的字母组合

讲解链接:代码随想录-17.电话号码的字母组合

String[] keys = new String[]{
        "",
        "",
        "abc",
        "def",
        "ghi",
        "jkl",
        "mno",
        "pqrs",
        "tuv",
        "wxyz",
};

public List<String> letterCombinations(String digits) {
    List<String> result = new ArrayList<>();
    if (digits == null || digits.length() == 0) return result;
    backtracking(digits, 0, new StringBuilder(), result);
    return result;
}

void backtracking(String digits, Integer startIndex, StringBuilder paths, List<String> result) {
    if (paths.length() == digits.length()) {
        result.add(new String(paths));
        paths = new StringBuilder();
        return;
    }
    int digit = Integer.valueOf(new Character(digits.charAt(startIndex)).toString());
    String letters = keys[digit];
    for (int i = 0; i < letters.length(); i++) {
        paths.append(letters.charAt(i));
        backtracking(digits, startIndex + 1, paths, result);
        paths.deleteCharAt(paths.length() - 1);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值