LeetCode77 组合
题目链接:https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html
代码:
public class code77 {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
Combine(n, k, 1);
return res;
}
private void Combine(int n, int k, int index) {
// 当path中元素数量为k时,收割结果
if (path.size() == k) {
res.add(new ArrayList<>(path));
return;
}
for (int i = index; i <= n; i++) {
// 剪枝操作
if ((n - index + 1) < (k - path.size())) {
return;
}
path.add(i);
Combine(n, k, i + 1);
path.removeLast(); // 回溯操作
}
}
}
LeetCode216 组合总和III
题目链接:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html
代码:
public class code216 {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
combination(k, n, 1, 0);
return res;
}
private void combination(int k, int targetSum, int startNum, int currentSum) {
// 剪枝
if (currentSum > targetSum) {
return;
}
// 收割结果
if (path.size() == k) {
if (currentSum == targetSum) {
res.add(new ArrayList<>(path));
}
return;
}
for (int i = startNum; i <= 9; i++) {
// 剪枝
if (path.size() > k) {
return;
}
path.add(i);
currentSum += i;
combination(k, targetSum, i + 1, currentSum);
path.removeLast(); // 回溯
currentSum -= i; // 回溯
}
}
}
LeetCode17 电话号码的字母组合
public class code17 {
List<String> res = new ArrayList<>();
StringBuilder path = new StringBuilder();
String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public List<String> letterCombinations(String digits) {
if (digits == null || digits.length() == 0) {
return res;
}
letterCombination(digits, 0);
return res;
}
private void letterCombination(String digits, int index) {
// 收割结果
if (index == digits.length()) {
res.add(path.toString());
return;
}
String str = numString[digits.charAt(index) - '0']; // 表示当前index对应的字符串 比如 2 对应abc
for (int i = 0; i < str.length(); i++) {
path.append(str.charAt(i));
letterCombination(digits, index + 1);
path.deleteCharAt(path.length() - 1); // 回溯
}
}
}