216.组合总和3
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
思路:这道题进行比较顺利,使用回溯算法,和前一个相似,主要不同点在于添加了一个计算和的数值。
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
sum(k, n, 1, 0);
return res;
}
public void sum(int k, int n, int start, int count){
if(list.size() == k){
if(count == n)
res.add(new ArrayList(list));
return;
}
for(int i = start; i <= 9 -(k - list.size()) + 1; i++ ){
list.push(i);
count += i;
sum(k, n, i+1, count);
list.pop();
count -= i;
}
}
}
17.电话号码的数字组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例: 输入:“23” 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序
思路:回溯法,使用一个string builder来代替数组,本质还是一样的。
实际写代码发现层次关系不是很好整理清楚。每次调用操作解析一个数字,并把这个数字所有可能的字母都添加进去一遍。
class Solution {
List<String> res = new ArrayList<>();
StringBuilder st = new StringBuilder();
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0)
return res;
String[] dict = {"","","abc",
"def","ghi","jkl","mno","pqrs","tuv","wxyz"};
combine(digits, dict, 0);
return res;
}
public void combine(String digits, String[] dict, int nums){
if(nums == digits.length()){
res.add(st.toString());
return;
}
String str = dict[digits.charAt(nums) - '0'];
for(int i = 0; i < str.length(); i ++){
st.append(str.charAt(i));
combine(digits, dict, nums + 1);
st.deleteCharAt(st.length() - 1);
}
}
}