216 组合总和III
https://leetcode.cn/problems/combination-sum-iii/description/
class Solution { // TO(9^k)
public List<List<Integer>> combinationSum3(int k, int n) {
List<Integer> cur = new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
dfs(result, cur, 0, 1, k, n);
return result;
}
private void dfs(List<List<Integer>> result, List<Integer> cur, int sum, int num, int k, int n) {
if (sum >= n) {
if (sum == n && cur.size() == k) result.add(new ArrayList<>(cur));
return;
}
for (int i = num; i <= 9; i++) {
cur.add(i);
dfs(result, cur, sum + i, i + 1, k, n);
cur.remove(cur.size() - 1);
}
}
}
class Solution { // TO(2^9)
public List<List<Integer>> combinationSum3(int k, int n) {
List<Integer> cur = new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
dfs(result, cur, 0, 1, k, n);
return result;
}
private void dfs(List<List<Integer>> result, List<Integer> cur, int sum, int num, int k, int n) {
if (num > 10) return;
if (sum >= n || cur.size() >= k) {
if (sum == n && cur.size() == k) result.add(new ArrayList<>(cur));
return;
}
dfs(result, cur, sum, num + 1, k, n);
cur.add(num);
dfs(result, cur, sum + num, num + 1, k, n);
cur.remove(cur.size() - 1);
}
}
17 电话号码的字母组合
https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
class Solution {
public List<String> letterCombinations(String digits) {
String[] pad = new String[]{"", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
List<String> result = new ArrayList<>();
StringBuilder sb = new StringBuilder();
if (digits == null || digits.length() == 0) return result; // bug corner case
dfs(result, sb, digits, 0, pad);
return result;
}
private void dfs(List<String> result, StringBuilder sb, String digits, int index, String[] pad) {
if (index == digits.length()) {
result.add(new String(sb));
return;
}
char[] options = pad[digits.charAt(index) - '1'].toCharArray();
for (char c : options) {
sb.append(c);
dfs(result, sb, digits, index + 1, pad);
sb.deleteCharAt(sb.length() - 1);
}
}
}