day25打卡:回溯算法part02
216.组合总和三
原题链接
代码随想录链接
和经典的回溯题目很相似,只是需要在每层for循环中都记录当前的总和;
Java代码如下:
class Solution {List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> combinationSum3(int k, int n) {backtracking(n,k,0,1);return result;}public void backtracking(int targetSum,int k,int sum,int startindex){if(path.size() == k){if(sum == targetSum) result.add(new ArrayList<>(path));return;}for(int i = startindex; i <= 9; i++){sum += i;path.add(i);backtracking(targetSum,k,sum,i+1);sum -= i;path.removeLast();}}
}
17.电话号码的数字组合
原题链接
代码随想录链接
我觉得这道题最重要的地方就在于需要对题目已知的这个条件做一个通俗易懂的转换,比如说题目所给的是2-9分别拥有了不同的字符,这个时候可以想到定义一个字符串数组,前两位定义为空字符串,从下标为2开始,每个位置都定义为对应数字的各个字符串。
知道了这个,那么接下来的思路就不难了,也是经典的回溯,只不过for循环的条件改了一点。
Java代码如下:
class Solution {String[] s = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};List<String> result = new ArrayList<>();StringBuilder sb = new StringBuilder();public void backtracking(String digits,String[] s,int num){if(sb.length() == digits.length()){result.add(sb.toString());return;}String str = s[digits.charAt(num)-'0'];for(int i = 0;i < str.length(); i++){sb.append(str.charAt(i));backtracking(digits,s,num+1);sb.deleteCharAt(sb.length()-1);}}public List<String> letterCombinations(String digits) {if(digits == null || digits.length() == 0) return result;backtracking(digits,s,0);return result;}
}