216.组合总和Ⅲ
- 216.组合总和Ⅲ | 题目链接
- 代码随想录 | 讲解链接
- 题意:找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
- 思路:回溯法,不仅回溯路径元素,总和也一并回溯。
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new LinkedList<>();
int sum;
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k, n, 0, 1);
return res;
}
public void backtracking(int k, int n, int sum, int startIndex) {
if(sum == n && path.size() == k) {
res.add(new ArrayList<>(path));
return;
}
for(int i = startIndex; i <= 9; i++) {
sum += i;
path.add(i);
backtracking(k, n, sum, i+1);
sum -= i;
path.remove(path.size() - 1);
}
}
}
17.电话号码的字母组合
-
题意:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
-
思路:
- 数字和字母如何映射
用字符串数组映射。 - 回溯法解决n个for循环的问题
- 数字和字母如何映射
class Solution {
//存放结果
List<String> res = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0) {
return res;
}
//字符串数组,下标数字对应所有字母,0和1对应空,从2-9对应键盘中相应字母
String[] numString = {"", "", "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
backtracking(digits, numString, 0);
return res;
}
//每次迭代获取一个字母,所以有大量字符串拼接,用StringBuilder更高效
StringBuilder temp = new StringBuilder();
//index用于记录遍历第几个数字(遍历digits的),也表示树的深度
public void backtracking(String digits, String[] numString, int index) {
//如果index和digit的长度一样了,说明已经遍历到空了
if(index == digits.length()){
//把此时拼接的temp加到结果中
res.add(temp.toString());
return;
}
//从digits的第一个数字开始,把字符转换成数字,从numString对应找该数字对应的字母
String str = numString[digits.charAt(index) - '0'];
//外层控制第一个数字代表的字母
for(int i = 0; i < str.length(); i++) {
temp.append(str.charAt(i));
//下一个数字(index+1)代表的字母
backtracking(digits, numString, index + 1);
temp.deleteCharAt(temp.length() - 1);
}
}
}