回溯模块
216.组合总和III
解题思路: 回溯法, 递归路径上求和, 判断和是否等于n, 另外需要传入索引, 对当前节点去重
代码:
class Solution {
List<List<Integer>> ans = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k, n, 0, 1);
return ans;
}
public void backtracking(int k, int n, int sum, int start) {
if(list.size() == k){
if(sum == n){
ans.add(new ArrayList<>(list));
}
return;
}
for(int i=start; i<=9; i++){
list.add(i);
backtracking(k, n, sum + i, i+1);
list.removeLast();
}
}
}
17.电话号码的字母组合
解题思路:
- 回溯法(将每个数字字符视作一层, 然后对于数字字符对应的字母进行横向遍历)
- 在路径上对遍历的字符串进行累加, 然后判断长度是否等于原字符串长度, 相等则加入集合
代码:
class Solution {
List<String> ans = new ArrayList<>();
HashMap<Integer, String> map = new HashMap<>();
public List<String> letterCombinations(String digits) {
if(digits.length() < 1) return ans;
map.put(2, "abc");
map.put(3, "def");
map.put(4, "ghi");
map.put(5, "jkl");
map.put(6, "mno");
map.put(7, "pqrs");
map.put(8, "tuv");
map.put(9, "wxyz");
backtracking(digits, "", 0);
return ans;
}
public void backtracking(String digits, String path, int start){
if(path.length() == digits.length()){
ans.add(path);
return;
}
char[] ch = map.get(digits.charAt(start)-'0').toCharArray();
for(int i=0; i<ch.length; i++){
backtracking(digits, path+ch[i], start+1);
}
}
}