Day22 回溯(1)
77,216,17
一、基础知识
回溯模板:
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
解决问题:暴力问题
特点:只能用暴力解决
二、题目
分析:
本题属于较基础的回溯题,主要是熟悉一下终止条件的判定以及如何去“恢复”
分析:
void backTracking(int n,int k,int startIndex){
if(path.size()>k){
// path = new ArrayList<>();
return;
}…………
}
代码中,我故作聪明的写了’ // path = new ArrayList<>();'这句话,导致指针异常,未综合考虑回溯的精髓。
分析:
本题主要难在怎么抽象,怎么将电话号码和里面的字母联系起来
代码
77
class Solution {
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backTracking(n,k,1);
return res;
}
void backTracking(int n,int k,int startIndex){
if(path.size()==k){
res.add(new ArrayList<>(path));
return;
}
for(int i = startIndex;i<=n;i++){
path.add(i);
backTracking(n,k,i+1);
path.removeLast();
}
}
}
227
class Solution {
List<List<Integer>> combin = new ArrayList<>();
List<Integer>path = new ArrayList<>();
int sum = 0;
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(n,k,1);
return combin;
}
void backTracking(int n,int k,int startIndex){
if(path.size()>k){
// path = new ArrayList<>();
return;
}
if(sum == n&&path.size()==k){
combin.add(new ArrayList<>(path));
return;
}
for(int i=startIndex;i<=9;i++){
path.add(i);
sum+=i;
backTracking(n,k,i+1);
sum-=i;
path.remove(path.size() - 1);
}
}
}
17
class Solution {
String [] MyMap = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
List<String> list = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if(digits == null||digits.length()==0){
return list;
}
backTaacking(digits,MyMap,0);
return list;
}
StringBuilder temp = new StringBuilder();
public void backTaacking(String digits,String[]numString,int num){
if(num==digits.length()){
list.add(temp.toString());
return;
}
String str = numString[digits.charAt(num) - '0'];
for(int i = 0;i<str.length();i++){
temp.append(str.charAt(i));
backTaacking(digits,numString,num+1);
temp.deleteCharAt(temp.length()-1);
}
}
}