代码随想录
216.组合总和III
思路
用一个变量保存最终结果,一个变量保存一次递归的结果。当和为n和计数为k的时候,就保存这次递归的结果且返回。
代码
class Solution {
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> path = new ArrayList<Integer>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtraking(k,n,1,0,0);
return result;
}
public void backtraking(int k,int n,int startIndex,int sum,int count){
if (sum>n || count >k) return;
if(sum == n && count == k){
result.add(new ArrayList<>(path));
return;
}
for(int i = startIndex;i<=9;i++){
sum += i;
count++;
path.add(i);
backtraking(k,n,i+1,sum,count);
sum -= i;
count--;
path.remove(path.size()-1);
}
}
}
17.电话号码的字母组合
思路
建立一个从数字到字母的映射数组,用来取值
回溯的过程中,每次遍历当前数字的字母,然后组合在一起,当到达输入的数组长度的时候就返回遍历的结果。
主要还是确定每次回溯的时候 遍历的是什么, 需要的结果是什么。
代码
class Solution {
List<String> list = new ArrayList<>();
StringBuilder path = new StringBuilder();
String[] map = {"","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public List<String> letterCombinations(String digits) {
//回溯法
char[] chard = digits.toCharArray();
if("".equals(digits)) return list;
backtracking(0,chard);
return list;
}
public void backtracking(int startIndex,char[] chard){
if(startIndex == chard.length ){
list.add(path.toString());
return;
}
String s = map[chard[startIndex]-'0'-1];
for(int j = 0;j<s.length();j++){
path.append(s.charAt(j));
backtracking(startIndex+1,chard);
path.delete(startIndex,startIndex+1);
}
}
}