代码随想录Day21

题目列表

  • 77.组合(LeetCode)
  • 216.组合总和III (LeetCode)
  • 17.电话号码的字母组合(LeetCode)

解题过程

77.组合

题目描述

解题思路

得到有效解之后,要及时回溯。
剪枝操作,因为结果集的长度有规定,可以提前结束循环。

代码展示

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {

        backtracking(n, k, 1);
        return result;
    }
    public void backtracking(int n, int k, int start){
        if(path.size() == k){
            result.add(new ArrayList<>(path));
            return;
        }

        for(int i = start; i <= n - (k - path.size()) + 1; i++){
            path.add(i);
            backtracking(n, k, i + 1);
            path.removeLast();
        }
    }
}

216.组合总和III

题目描述

解题思路

对剪枝操作有了更近一步的理解。

代码展示

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

17.电话号码的字母组合

题目描述

解题思路

本题是两个集合里的元素进行组合,所以不再用 start 来记录起始位置,而是用 index 来标记是哪个集合(哪个数字)。
终止条件也值得注意,index == digits,length(),表示两个集合的情况都已经收集完了。

代码展示

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

        int num = digits.charAt(index) - '0';
        String curString = numString[num];
        for(int i = 0; i < curString.length();i++) {
            path.append(curString.charAt(i));
            backtracking(numString, digits, index + 1);
            path.deleteCharAt(path.length()-1);
        }
    }
}

参考资料

代码随想录

posted @ 2025-05-22 01:16  cbdsszycfs  阅读(6)  评论(0)    收藏  举报