代码随想录刷题Day22回溯(力扣77,216,17)

Day22 回溯(1)

  77,216,17

一、基础知识

回溯模板:
void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}
解决问题:暴力问题
特点:只能用暴力解决

二、题目

image-20240820074948547

分析:

本题属于较基础的回溯题,主要是熟悉一下终止条件的判定以及如何去“恢复”

image-20240820080516795

分析:

void backTracking(int n,int k,int startIndex){
if(path.size()>k){
// path = new ArrayList<>();
return;
}

   …………

}

代码中,我故作聪明的写了’ // path = new ArrayList<>();'这句话,导致指针异常,未综合考虑回溯的精髓。

image-20240820080731092

分析:

本题主要难在怎么抽象,怎么将电话号码和里面的字母联系起来

代码

77

class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    List<Integer> path = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n,k,1);
        return res;
    }


    void backTracking(int n,int k,int startIndex){
        if(path.size()==k){
            res.add(new ArrayList<>(path));
            return;
        }

        for(int i = startIndex;i<=n;i++){
            path.add(i);
            backTracking(n,k,i+1);
            path.removeLast();
        }
    }
}

227

class Solution {
    List<List<Integer>> combin = new ArrayList<>();
    List<Integer>path = new ArrayList<>();
    int sum = 0;

    public List<List<Integer>> combinationSum3(int k, int n) {
        backTracking(n,k,1);
        return combin;
    }


    void backTracking(int n,int k,int startIndex){
        if(path.size()>k){
           // path = new ArrayList<>();
            return;
        }

        if(sum == n&&path.size()==k){
            combin.add(new ArrayList<>(path));
            return;
        }

        for(int i=startIndex;i<=9;i++){
            path.add(i);
            sum+=i;
            backTracking(n,k,i+1);
            sum-=i;
            path.remove(path.size() - 1);
        }
    }
}

17

class Solution {
    String [] MyMap = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    List<String> list = new ArrayList<>();
    public List<String> letterCombinations(String digits) {
        if(digits == null||digits.length()==0){
            return list;
        }
        backTaacking(digits,MyMap,0);
        return list;
    }

    StringBuilder temp = new StringBuilder();

    public void backTaacking(String digits,String[]numString,int num){
        if(num==digits.length()){
            list.add(temp.toString());
            return;
        }

        String str = numString[digits.charAt(num) - '0'];
        for(int i = 0;i<str.length();i++){
            temp.append(str.charAt(i));
            backTaacking(digits,numString,num+1);
            temp.deleteCharAt(temp.length()-1);
        }
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值