代码随想录day 25 回溯算法

代码随想录day 25 回溯算法

题216

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

思考:

按照回溯的模版代码,确定好函数参数和全局变量,参考77题,此题不难写出来。

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>(); 
    int count = 0;
    public List<List<Integer>> combinationSum3(int k, int n) {
        backTracking(k, n, 1);
        return result;
    }

    public void backTracking(int k, int n, int startIndex){
        //剪枝
        if(count > n){
            return;
        }
        if(path.size() > k){
            return;
        }
        if(path.size() == k && count == n){
            result.add(new ArrayList<>(path));
            return;
        }
        for(int i = startIndex; i <= 9; i++){
            path.add(i);
            count += i;
            backTracking(k, n, i + 1);
            int e = path.removeLast();
            count -= e;
        }
    }
}

题17 电话号码的字母组合

启发

1,回溯算法要想清楚递归函数的参数的意义。
2, 顺便复习一下char的加减。

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

    public void backTracking(String digits, String[] numString, int index){
        if(index == digits.length()){
            result.add(path.toString());
            return;
        }
        String str = numString[digits.charAt(index) - '0'];//两个字符相减赋值给int。
        for(int i = 0; i < str.length(); i++){
            path.append(str.charAt(i));
            backTracking(digits, numString, index + 1);
            path.deleteCharAt(path.length() - 1);
        }

    }
}

你可能感兴趣的:(leetcode,算法,java,c++)