代码随想录算法训练营第22天 | 开始复习回溯

2024年7月24日

回溯入门
用for来遍历每个元素,然后进入递归。

题77. 组合
给出n和k,可选元素1到n,k是组合个数。
易错:添加进外层list时要new一个,否则后续修改会影响已经添加的内层list

class Solution {

    List<List<Integer>> list1;
    List<Integer> list2;
    
    public List<List<Integer>> combine(int n, int k) {
        list1 = new ArrayList<>();
        list2 = new ArrayList<>();
        for(int i=1;i<=n;i++){
            list2.add(i);
            digui(i+1,n,k);
            list2.removeLast();
        }
        return list1;
    }

    public void digui(int startIndex,int n,int k){
        if(list2.size()==k){
            list1.add(new ArrayList(list2));
            return;
        }
        for(int i=startIndex;i<=n;i++){
            list2.add(i);
            digui(i+1,n,k);
            list2.removeLast();
        }
    }   
}

题216. 组合总和 III
易错,递归时传参是传i而不是传startIndex,前者是不断增长而后者是固定的

class Solution {

    List<Integer> path;
    List<List<Integer>> res;
    int sum;
    public List<List<Integer>> combinationSum3(int k, int n) {
        path = new ArrayList<>();
        res = new ArrayList<>();
        sum=0;
        for(int i=1;i<=9;i++){
            path.add(i);
            sum+=i;
            digui(i+1, k, n);
            sum-=i;
            path.removeLast();
        }
        return res;
    }

    public void digui(int startIndex, int k, int n){
        if(path.size()==k){
            if(sum==n){
                res.add(new ArrayList(path));
            }
        }else{
            for(int i=startIndex;i<=9;i++){
                path.add(i);
                sum+=i;
                digui(i+1, k, n);
                path.removeLast();
                sum-=i;
            }
        }
    }
}

题17. 电话号码的字母组合

class Solution {

    HashMap<Integer, List<String>> map;
    List<String> res;
    String path;
    public List<String> letterCombinations(String digits) {
        path = "";
        res = new ArrayList<>();
        map = new HashMap<>();
        if(digits.length()==0){
            return res;
        }
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("a"); list2.add("b"); list2.add("c");
        ArrayList<String> list3 = new ArrayList<>();
        list3.add("d"); list3.add("e"); list3.add("f");
        ArrayList<String> list4 = new ArrayList<>();
        list4.add("g"); list4.add("h"); list4.add("i");
        ArrayList<String> list5 = new ArrayList<>();
        list5.add("j"); list5.add("k"); list5.add("l");
        ArrayList<String> list6 = new ArrayList<>();
        list6.add("m"); list6.add("n"); list6.add("o");
        ArrayList<String> list7 = new ArrayList<>();
        list7.add("p"); list7.add("q"); list7.add("r"); list7.add("s");
        ArrayList<String> list8 = new ArrayList<>();
        list8.add("t"); list8.add("u"); list8.add("v");
        ArrayList<String> list9 = new ArrayList<>();
        list9.add("w"); list9.add("x"); list9.add("y"); list9.add("z");
        map.put(2,list2);
        map.put(3,list3);
        map.put(4,list4);
        map.put(5,list5);
        map.put(6,list6);
        map.put(7,list7);
        map.put(8,list8);
        map.put(9,list9);
        String start = digits.substring(0,1);
        for(int i=0;i<map.get(new Integer(start)).size();i++){
            path+=map.get(new Integer(start)).get(i);
            digui(1,digits);
            path="";
        }
        return res;
    }

    public void digui(int startIndex, String digits){
        if(startIndex==digits.length()){
            res.add(new String(path));
        }else{
            String start = digits.substring(startIndex,startIndex+1);
            for(int i=0;i<map.get(new Integer(start)).size();i++){
                path+=map.get(new Integer(start)).get(i);
                digui(startIndex+1, digits);
                path=path.substring(0,path.length()-1);
            }
        }
    }
}
posted @ 2024-07-24 10:19  hailicy  阅读(1)  评论(0编辑  收藏  举报