代码随想录刷题Day25 | 216. 组合总和 III | 17.电话号码的字母组合
216. 组合总和 III
题目:
找出所有相加之和为 n
的 k
个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
思路:
遍历数字1到9,找到[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。
代码:
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> path = new ArrayList<>();
int sum = 0;
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(k, n, 1);
return result;
}
public void backTracking(int k, int n, int start){
if(path.size() == k){
if(sum == n){
result.add(new ArrayList<>(path));
}
return;
}
for(int i = start; i <= 9; i++){
path.add(i);
sum += i;
backTracking(k, n, i + 1);
path.remove(path.size() - 1);
sum -= i;
}
}
}
17.电话号码的字母组合
题目:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
思路:
首先定义一个映射,将数字映射到字符串上。然后使用回溯算法来解决问题。
首先遍历第一个数字对应的字母的组合,添加进path中,然后再添加第二个数字对应的字母,如果path的长度等于digits的长度,添加进result中去,然后遍历该数字对应的下一个字母,直至遍历完所有的字母。这个过程和for循环很像,但是for循环的个数不确定,只能使用回溯。
代码:
class Solution {
List<String> result = new ArrayList<>();
StringBuffer path = new StringBuffer();
String[] letterMap = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public List<String> letterCombinations(String digits) {
if(digits.equals("")) return result;
backTracking(digits, 0);
return result;
}
public void backTracking(String digits, int n){
if(path.length() == digits.length()){
result.add(path.toString());
return;
}
for(int i = 0; i < letterMap[digits.charAt(n) - '0'].length(); i++){
path.append(letterMap[digits.charAt(n) - '0'].charAt(i));
backTracking(digits, n + 1);
path.deleteCharAt(path.length() - 1);
}
}
}