回溯day1
77. 组合
class Solution {
List<List<Integer>> res;
LinkedList<Integer> path;
public List<List<Integer>> combine(int n, int k) {
res = new ArrayList<>();
path = new LinkedList<>();
backtracking(n, k, 1);
return res;
}
private void backtracking(int n, int k, int s) {
if (path.size() == k) {
res.add(new ArrayList(path));
return;
}
//for (; s <= n; s++) {
for (; s <= n - (k - path.size()) + 1; s++) {
path.add(s);
backtracking(n, k, s + 1);
path.removeLast();
}
}
}
216. 组合总和 III
class Solution {
private List<List<Integer>> res;
//removeLast() java.util.LinkedList;
private LinkedList<Integer> path;
private int sum;
public List<List<Integer>> combinationSum3(int k, int n) {
res = new ArrayList<>();
path = new LinkedList<>();
sum = 0;
if (k > 9 || k < 1) return res;
int upper = 9, lower = 1, max = 0, min = 0;
for (int i = 0; i < k; i++) {
max += upper;
upper--;
min += lower;
lower++;
}
if (n > max || n < min) return res;
backtracking(n, k, 1);
return res;
}
private void backtracking(int n, int k, int s) {
if (path.size() > k) return;
if (path.size() == k && sum == n) {
res.add(new ArrayList<>(path));
return;
}
for (; s <= 9; s++) {
path.add(s);
sum += s;
backtracking(n, k, s + 1);
path.removeLast();
sum -= s;
}
}
}