组合总和 III
力扣连接:216. 组合总和 III(中等)
1.回溯的方法
图解步骤
关键点:
- 剪枝放在开始以及 n>=0 处
递归代码
class Solution {
List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> tmp = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
back(k, n, 1);
return result;
}
public void back(int k, int n, int index){
if(tmp.size()>k){
return;
}
if(n==0&&tmp.size()==k){
result.add(new ArrayList<>(tmp));
return;
}
for(int i = index; i<=9 && n>=0; i++){
tmp.add(i);
n -= i;
back(k, n, i+1);
tmp.removeLast();
n += i;
}
}
}
电话号码的字母组合
力扣连接:17. 电话号码的字母组合(中等)
1.回溯的方法
图解步骤
递归代码
class Solution {
Map<Integer, String> map = new HashMap<>();
List<String> result = new ArrayList<>();
StringBuilder tmp = new StringBuilder();
public List<String> letterCombinations(String digits) {
if(digits.isEmpty()) return result;
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");
back(0, digits);
return result;
}
public void back(int indexNum, String digits){
if(tmp.length()==digits.length()){
result.add(new String(tmp));
return;
}
Integer curNum = digits.charAt(indexNum) - '0';
for(int j = 0;j<map.get(curNum).length();j++){
tmp.append(map.get(curNum).charAt(j));
back(indexNum + 1, digits);
tmp.deleteCharAt(tmp.length()-1);
}
}
}