代码随想录算法训练营day25| 216.组合总和III、17.电话号码的字母组合

Leetcode 216.组合总和III

题目链接
思路:回溯算法
代码

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

	// targetSum:目标和,也就是题目中的n
	// k:题目中要求的k个数的集合
	// sum:已经收集的元素的总和,也就是path里元素的总和
	// startIndex:下一层for循环搜索的起始位置
    private void backtracking(int targetSum, int k, int sum, int startIndex) {

        // 剪枝:如果一层里的sum和大于了目标和,跳出递归
        if (sum > targetSum) {
            return;
        } 

        if (path.size() == k) {
            if (targetSum == sum) {
                result.add(new ArrayList<>(path));
            }
        }

		// 剪枝:对for循环里,9 - (k - path.size()) + 1为最多能取到的下标
        for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
            path.add(i);
            sum += i;
            backtracking(targetSum, k, sum, i + 1);
            // 回溯
            path.remove(path.size() - 1);
            sum -= i;
        }
    }
}

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

题目链接
思路:回溯算法
代码

class Solution {
    List<String> result = new ArrayList<>();
    // 用于存放每次迭代获取的字符
    StringBuilder sb = new StringBuilder();
    // 初始对应所有的数字,为了直接对应2-9,新增了两个无效的字符串""
    String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

    public List<String> letterCombinations(String digits) {
        if (digits == null || digits.length() == 0) {
            return result;
        }
        backtracking(digits, 0);
        return result;
    }

    private void backtracking(String digits, int index) {
        // 终止条件
        if (index == digits.length()) {
            result.add(sb.toString());
            return;
        }
        // 将index指向的数字转为int
        int digit = digits.charAt(index) - '0';
        // 获取数字对应的字符集
        String str = numString[digit];
        // 遍历该字符集
        for (int i = 0; i < str.length(); i++) {
            sb.append(str.charAt(i));
            // 递归遍历下一个字符集
            backtracking(digits, index + 1);
            // 回溯,剔除末尾元素,继续进行尝试
            sb.deleteCharAt(sb.length() - 1);
        }
    }
}

你可能感兴趣的:(代码随想录算法训练营,算法,leetcode,职场和发展,数据结构,java)