这些回溯题寒假刚刚刷过,所以快速练练手过一遍~
class Solution {
private void backtracking(List<List<Integer>> res, List<Integer> tmp, int start, int n, int k){
if(tmp.size() == k){
res.add(new ArrayList<Integer>(tmp));
return;
}
for(int i = start; i <= n; ++i){
tmp.add(i);
backtracking(res, tmp, i+1, n, k);
tmp.remove(tmp.size()-1);
}
}
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> tmp = new ArrayList<>();
backtracking(res, tmp, 1, n, k);
return res;
}
}
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> tmp = new ArrayList<>();
int sum = 0;
private void backtracking(int k, int n, int start){
if(sum == n && tmp.size() == k){
res.add(new ArrayList<Integer>(tmp));
return;
}
for(int i = start; i <= 9; ++i){
sum += i;
tmp.add(i);
backtracking(k, n, i+1);
tmp.remove(tmp.size()-1);
sum -= i;
}
}
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k, n, 1);
return res;
}
}
进行两个剪枝:
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> tmp = new ArrayList<>();
int sum = 0;
private void backtracking(int k, int n, int start){
if(tmp.size() == k){
if(sum == n) res.add(new ArrayList<Integer>(tmp));
return;
}
if(sum >= n) return;
for(int i = start; i <= 9 - (k - tmp.size())+1; ++i){
sum += i;
tmp.add(i);
backtracking(k, n, i+1);
tmp.remove(tmp.size()-1);
sum -= i;
}
}
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k, n, 1);
return res;
}
}
3.Letter Combinations of a Phone Number
只是把回溯变成了string而已,就这?
class Solution {
List<String> res = new ArrayList<>();
String arr[] = {"", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
private void backtracking(String digits, int start, String tmp){
if(tmp.length() == digits.length()){
String copy = tmp;
res.add(copy);
return;
}
int used = Integer.parseInt(digits.substring(start, start+1))-1;
for(int i = 0; i < arr[used].length(); ++i){
tmp += arr[used].substring(i, i+1);
backtracking(digits, start+1, tmp);
tmp = tmp.substring(0, tmp.length()-1);
}
}
public List<String> letterCombinations(String digits) {
if(digits.equals("")) return res;
backtracking(digits, 0, "");
return res;
}
}

1080

被折叠的 条评论
为什么被折叠?



