学习目标:
60天训练营打卡计划!
学习内容:
216. 组合总和 III
- 要熟记回溯的步骤,加深对于回溯的理解。
- 含有两次剪枝操作
① i <= 9 - (k - path.size()) + 1 – 保证有足够的个数来满足k — 记住就可以。
② break
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
private void backtracking(int sum, int n, int k, int startIndex){
if(path.size() == k)
if(sum == n)
res.add(new ArrayList<>(path));
return;
for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i++){
if(n + i <= sum){
n += i;
path.add(i);
backtracking(sum, n, k, i+1);
n -= i;
path.remove(path.size() - 1);
}
else
break;
}
}
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(n, 0, k, 1);
return res;
}
}
17. 电话号码的字母组合
- 多个集合求组合
- 这个题主要是对api不熟悉。
- 首先,不知道如何建立一个映射关系。
① 二维数组(下面的题解使用的方法)
② 使用map(比较复杂,且不会初始化) - 对StringBuilder类不熟悉,添加删除求长度及转String都不是很熟悉。
- 如何把一个char类型的数字变为int也遗忘了
class Solution {
List<String> res = new ArrayList<>();
StringBuilder select = new StringBuilder();
String[] map = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
private void backtracking(String digits, int start ){
if(digits == null || digits.length() == 0) return;
if(start == digits.length()){
res.add(select.toString());
return;
}
int cur = digits.charAt(start) - '0';
for(int i = 0; i < map[cur - 2].length(); i++){
select.append(map[cur - 2].charAt(i));
backtracking(digits,start + 1);
select.deleteCharAt(select.length() - 1);
}
}
public List<String> letterCombinations(String digits) {
backtracking(digits,0);
return res;
}
}
学习时间: