代码随想录打卡第二十八天|216.组合总和III 17.电话号码的字母组合

216 组合总和Ⅲ

题目链接:216 组合总和Ⅲ
解题思路:可以直接用回溯暴力
代码如下:

class Solution {
    private List<List<Integer>> result=new ArrayList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<Integer> oneofresult=new ArrayList<Integer>();
        backtrack(k,k,n,1,oneofresult);
        return result;
    }
    public void backtrack(int num,int k,int n,int index,List<Integer> oneofresult){
        if(n==0){
            if(oneofresult.size()==num){
                result.add(new ArrayList<Integer>(oneofresult));
            }
            return;
        }
        if(k==0){
            if(n==0){
                result.add(new ArrayList<Integer>(oneofresult));
            }
            return;
        }
        for(int i=index;i<=9;i++){
            oneofresult.add(i);
            backtrack(num,k-1,n-i,i+1,oneofresult);
            oneofresult.remove(oneofresult.size()-1);
        }
    }
}

剪枝操作
个数大于规定个数或总和大于规定总和时进行剪枝

17电话号码的字母组合

题目链接: 17电话号码的字母组合
这里注意不用遍历digits 否则会多出以3中字母开头的答案

class Solution {
    private List<String> result=new ArrayList<String>();
    private List<String> nums=new ArrayList<String>();
    public List<String> letterCombinations(String digits) {
        nums.add("abc");//2
        nums.add("def");//3
        nums.add("ghi");//4
        nums.add("jkl");//5
        nums.add("mno");//6
        nums.add("pqrs");//7
        nums.add("tuv");//8
        nums.add("wxyz");//9
        StringBuffer oneofresult=new StringBuffer();
        if(digits.length()==0){
            return result;
        }
        backtrack(digits,oneofresult,0);
        return result;
    }
    public void backtrack(String digits,StringBuffer oneofresult,int index){
        if(oneofresult.length()==digits.length()){
            result.add(new String(oneofresult));
            return;
        }
        char num=digits.charAt(index);
        int intnum=new Integer(num);
        String letter=nums.get(intnum-50);
        for(int j=0;j<letter.length();j++){
            oneofresult.append(letter.charAt(j));
            backtrack(digits,oneofresult,index+1);
            oneofresult.deleteCharAt(oneofresult.length()-1);
        }
    }
}

注意参数的定义!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没脑袋的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值