代码随想录算法训练营day25|组合总和Ⅲ、电话号码的字母组合

2023.4.8 组合总和Ⅲ

216. 组合总和 III - 力扣(LeetCode)

如何才能算出他们的相加值?

使用一个变量来记录

不使用剪枝的话会导致时间复杂度过高,如何才能使用剪枝操作?

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        backTracking(k,n,1,0);
        return res;
    }
    public void backTracking(int k,int n,int start,int sum){
        if(sum > n){
            //直接停止递归,然后回溯
            return;
            }
        if(path.size() == k && sum == n){
            res.add(new ArrayList(path));
            return;
        }
        else if(path.size() == k){
            return;
        }
        for(int i = start;i<=9-(k-path.size()) + 1;i++){
            
            sum += i;
            path.add(i);
            backTracking(k,n,i+1,sum);
            sum -= i;
            path.removeLast();
        }
    }
}

我们所做的剪枝操作,一是当我们的sum之和大于了n时,后面的无需再进行递归了,直接返回即可

而是经典的组合中的剪枝操作,就是当我们的结果集还需要加入的元素个数与目标集合剩余元素个数不匹配时,也不进行递归了。

即经典的 i < n - ( k - path.size()) + 1

2023.4.9 电话号码的字母组合

17. 电话号码的字母组合 - 力扣(LeetCode)

问题:如何根据给出的字符串中的数组来构建我们的目标英文集合?

使用hashMap构建

class Solution {
    List<String>  res = new ArrayList<>();
    public List<String> letterCombinations(String digits) {
        if(digits.length() == 0){
            return res;
        }
        //构建一个hashMap来存放字母和数字的映射
        HashMap<Character,String> phoneNum = new HashMap<>(){{
            put('2',"abc");
            put('3', "def");
            put('4', "ghi");
            put('5', "jkl");
            put('6', "mno");
            put('7', "pqrs");
            put('8', "tuv");
            put('9', "wxyz");
        }};

        backTracking(digits,phoneNum,0,new StringBuilder());
        return res;
    }
    public void backTracking(String digits,HashMap<Character,String> phoneNum,int index,StringBuilder temp){
        //终止条件:index的作用就是让我们记录下来temp已经传入了几个字母了。如果因为是从0开始的,所以如果index+1 的长度与我峨嵋你digits的长度相等,代表我们传入的字母数已经足够了,不需要再传入了。直接回溯即可。
        if(index == digits.length()){
            res.add(temp.toString());
            return;
        }
        //获取到传入字符对应的字母集合
        char digit = digits.charAt(index);
        String letters = phoneNum.get(digit);
        for(int i = 0;i<letters.length();i++){
            temp.append(letters.charAt(i));
            backTracking(digits,phoneNum,index+1,temp);
            //回溯
            temp.deleteCharAt(index);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值