[刷题记录Day 25]Leetcode组合之回溯算法

发布时间 2023-09-11 13:01:01作者: 喜欢毛绒绒的番茄子

No.1

题目

组合总和 III

思路

  • 回溯法

递归分析

  1. 全局变量:path存储临时路径、result存储结果
  2. 返回值:空,参数:k,n,start表示从[1, 9]之间哪个数开始
  3. 终止条件:发现凑够k个数,判断值等于n,就放入结果集
  4. 单层递归逻辑:处理当前节点,递归,回溯

代码

List<List<Integer>> result = new ArrayList<>();  
LinkedList<Integer> path = new LinkedList<>();  
  
public void combineHelper(int k, int n, int start, int sum) {  
    if (path.size() == k && sum == n) {  
        result.add(new ArrayList<>(path));  
        return;  
    }  
  
    for (int i = start; i <= 9; i++) {  
        path.add(i);  
        combineHelper(k, n, i + 1, sum + i);  
        path.removeLast();  
    }  
}  
  
public List<List<Integer>> combinationSum3(int k, int n) {  
    combineHelper(k, n, 1, 0);  
    return result;  
}

No.2

题目

电话号码的字母组合

思路

  • 回溯法
  • 数字和字母映射
  • 不能在类成员写Map<Character, String> map = new HashMap<>(){{map.put(K, V)}};Leetcode报空指针异常

递归分析

  1. 全局变量:path,result
  2. 返回值:空,参数:digits,index记录遍历第几个数字了
  3. 终止条件:index 等于 输入的数字个数(digits.size)了,收集结果,结束本层递归。
  4. 单层递归逻辑:取index指向的数字,并找到对应的字符集;for循环来处理这个字符集;

代码

List<String> result = new ArrayList<>();  
StringBuilder path = new StringBuilder();  
Map<Character, String> map = new HashMap<>();  
public void combineHelper(String digits, int index) {  
    if (index == digits.length()) {  
        result.add(path.toString());  
        return;  
    }  
  
    char digit = digits.charAt(index);  
    String letters = map.get(digit);  
    for (int i = 0; i < letters.length(); i++) {  
        path.append(letters.charAt(i));  
        combineHelper(digits, index + 1);  
        path.deleteCharAt(path.length() - 1);  
    }  
}  
  
public List<String> letterCombinations(String digits) {  
    if (digits.length() == 0)  
        return result;  
      
    map.put('2', "abc");  
    map.put('3', "def");  
    map.put('4', "ghi");  
    map.put('5', "jkl");  
    map.put('6', "mno");  
    map.put('7', "pqrs");  
    map.put('8', "tuv");  
    map.put('9', "wxyz");  
  
    combineHelper(digits, 0);  
    return result;  
}