代码随想录算法训练营第22天 | 组合 组合总和 电话号码的字母组合

发布于:2025-03-07 ⋅ 阅读:(24) ⋅ 点赞:(0)

77. 组合

77. 组合 - 力扣(LeetCode)

class Solution {
    List<Integer> path = new ArrayList<>();
    List<List<Integer>> result = new ArrayList<>();
    public void backTracking(int n,int k,int startIndex){
        if(path.size() == k){
            result.add(new ArrayList(path));
            return;
        }
        for(int i = startIndex;i <= n;i++){//剪枝:i <= n - (k - path.size()) + 1
            path.add(i);
            backTracking(n,k,i+1);
            path.remove(path.size()-1);
        }
    }
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n,k,1);
        return result;
    }
}

题目链接/文章讲解:代码随想录

视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

剪枝操作:带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

216.组合总和III

题目链接/文章讲解:代码随想录

视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili

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

17.电话号码的字母组合

题目链接/文章讲解:代码随想录

视频讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibili

class Solution {
    StringBuilder path = new StringBuilder();
    List<String> res = new ArrayList<>();
    public void backTracking(String digits,String[] numString,int index){
        if(index == digits.length()){
            res.add(path.toString());
            return;
        }
        String str = numString[digits.charAt(index) - '0'];//找到数字映射的字母
        for(int i = 0;i < str.length();i++){
            path.append(str.charAt(i));//遍历各个字母
            backTracking(digits,numString,index + 1);//对下个数字进行相同的步骤
            path.deleteCharAt(path.length()-1);//回溯
        }
    }

    public List<String> letterCombinations(String digits) {
       if(digits == null || digits.length() == 0)return res;
       String[] numString = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//数字和字母的关系
       backTracking(digits,numString,0);
       return res;
    }
}