#LeetCode 216. Combination III
#LeetCode 216. 视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili
如果做了77 题后,这个题目可以用相似的思路。回溯三部曲:
1. 确定递归函数的参数以及返回值:一维数组path来存放符合条件的结果,二维数组result来存放结果集。
2. 确定终止条件:path 的长度等于目标长度k 。
3. 确定单层递归逻辑:path 收集每次选取的元素,用sum来记录path 里元素的和。
代码:
class Solution {
LinkedList path = new LinkedList<>();
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k, n, 1, 0);
return result;
}
public void backtracking(int k, int n, int startIndex, int sum) {
if (sum > n) {
return;
}
if (sum == n) {
if (path.size() == k) {
result.add(new LinkedList<>(path));
}
return;
}
for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
path.add(i);
sum += i;
backtracking(k, n, i + 1, sum);
sum -= i;
path.removeLast();
}
}
}
#LeetCode 17. Letter Combinations of a Phone Number
#LeetCode 17. 视频讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibili
这个遇上一个题目index 的区别是,上一个题目的index 是为了记录不同的起始位置,来保证生成不同的结果,这个题目是在两个字符串中操作,所以i 都是在0 开始。
这个题目中的index 是记录遍历到digits 中的第几个数字了。终止条件就是如果index 等于输入的数字个数,注意这里是length 不是length - 1 ,因为最后一个元素也会被操作。StringBuilder 在java 中有很多常用方法,例如:append(), deleteCharAt(), insert()等。
代码:
class Solution {
StringBuilder path = new StringBuilder();
List<String> result = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if (digits.length() == 0 || digits == null) {
return result;
}
String[] letterMap = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
backtracking(digits, letterMap, 0);
return result;
}
public void backtracking(String digits, String[] letterMap, int index) {
if (digits.length() == index) {
result.add(path.toString());
return;
}
int digit = digits.charAt(index) - '0';
String letter = letterMap[digit];
for (int i = 0; i < letter.length(); i++) {
path.append(letter.charAt(i));
backtracking(digits, letterMap, index + 1);
path.deleteCharAt(path.length() - 1);
}
}
}