25-回溯算法-216.组合总和3 17.电话号码的数字组合

216.组合总和3

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。

思路:这道题进行比较顺利,使用回溯算法,和前一个相似,主要不同点在于添加了一个计算和的数值。

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> list = new LinkedList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        sum(k, n, 1, 0);
        return res;

    }
    public void sum(int k, int n, int start, int count){
        if(list.size() == k){
            if(count == n)
                res.add(new ArrayList(list));
            return;
        }
        for(int i = start; i <= 9 -(k - list.size()) + 1; i++ ){
            list.push(i);
            count += i;
            sum(k, n, i+1, count);
            list.pop();
            count -= i;
        }
        
    }
}

17.电话号码的数字组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例: 输入:“23” 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序

思路:回溯法,使用一个string builder来代替数组,本质还是一样的。
实际写代码发现层次关系不是很好整理清楚。每次调用操作解析一个数字,并把这个数字所有可能的字母都添加进去一遍。

class Solution {
    List<String> res = new ArrayList<>();
    StringBuilder st = new StringBuilder();
    public List<String> letterCombinations(String digits) {
        if(digits == null || digits.length() == 0)
            return res;
        String[] dict = {"","","abc",
                         "def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        combine(digits, dict, 0);
        return res;
    }
    public void combine(String digits, String[] dict, int nums){
        if(nums == digits.length()){
            res.add(st.toString());
            return;
        }
        String str = dict[digits.charAt(nums) - '0'];
        for(int i = 0; i < str.length(); i ++){
            st.append(str.charAt(i));
            combine(digits, dict, nums + 1);
            st.deleteCharAt(st.length() - 1);
        }
        
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值