1.216. 组合总和 III
1.1 链接
https://leetcode.cn/problems/combination-sum-iii
1.2 关键知识点
1.3 自己遇到的细节问题
- 注意这里n是和了。。 而不是之前的数组中数字数量,需要注意看参数
1.4 题解
class Solution {
List<List<Integer>> rs = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
if(k == 0 || n == 0){return rs;}
backTracking(k , n, 1, 0);
return rs;
}
public void backTracking(int k , int n, int start, int sum){
if(path.size() == k){
if(sum == n){
rs.add(new ArrayList<>(path));
}
return;
}
int remaining = k - path.size();// 剪枝操作1
for(int i = start; i <= 9 - remaining + 1; i ++){//注意是<=,这里数字长度为9
sum += i;
path.add(i);
if (sum > n) { // 剪枝操作2
sum -= i;
path.removeLast();
return;
}
backTracking(k, n, i + 1, sum);
sum -= i;
path.removeLast();
}
}
}
2.电话号码字母组合
2.1 链接
https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
2.2 关键知识点
- 每次for的宽度。在同一个集合求组合中,是每次for宽度递减,而在不同集合组合中,每次宽度是按照情况固定的
- 参数的递增:思考一下第一次递归更新的条件应该是什么,例如这里是进入下一个letter映射中,而不是进入下一个字母,因此是letterIndex + 1
2.3 自己遇到的细节问题
- StringBuider创建 StringBuilder path = new StringBuilder();转为String path.toString();
- 加上append,去除.deleteCharAt(temp.length() - 1);
- 定义数组应该是{}大括号
2.4 题解
class Solution {
List<String> rs = new ArrayList<>();
StringBuilder path = new StringBuilder();
String[] dic = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public List<String> letterCombinations(String digits) {
if(digits.length() == 0){return rs;}
backTracking(digits, 0);
return rs;
}
public void backTracking(String digits, int letterIndex){
if(letterIndex == digits.length()){//1.深度控制
rs.add(path.toString());
return;
}
char ch = digits.charAt(letterIndex);
String letter = dic[ch - '0']; // 取数字对应的字符集
for(int i = 0; i < letter.length(); i ++){ //2每次for的宽度。在同一个集合求组合中,是每次for宽度递减,而在不同集合组合中,每次宽度是按照情况固定的
path.append(letter.charAt(i));
backTracking(digits, letterIndex + 1);//3. 参数的递增:思考一下第一次递归更新的条件应该是什么,例如这里是进入下一个letter映射中,而不是进入下一个字母,因此是letterIndex + 1
path.deleteCharAt(path.length() - 1);
}
}
}