这里写目录标题
Leecode习题
216.组合总和III
相比于77题,多了一步剪枝的操作是,如果 sum>targetsum,就可以直接结束
剪枝:还需要
k
−
p
a
t
h
.
s
i
z
e
(
)
k - path.size()
k−path.size()个,所以最多取到倒数第
k
−
p
a
t
h
.
s
i
z
e
(
)
k-path.size()
k−path.size()个,对应得索引
i
n
d
e
x
index
index就是9 - (k - path.size()) + 1
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(n, k, 1, 0);
return res;
}
private void backTracking(int targetSum, int k, int startIndex, int sum) {
// 减枝
if (sum > targetSum) {
return;
}
if (path.size() == k) {
if (sum == targetSum) res.add(new ArrayList<>(path));
return;
}
// 减枝 9 - (k - path.size()) + 1
for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
path.push(i);
sum += i;
backTracking(targetSum, k, i + 1, sum);
path.pop();
//回溯
sum -= i;
}
}
}
17.电话号码的字母组合
class Solution {
String [] numString = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv", "wxyz"};
List<String> res = new ArrayList<>();
public List<String> letterCombinations(String digits) {
// Deque<Character> path = new ArrayDeque<>(); //(后面path要变成string,所以这里用栈难搞)
StringBuilder path = new StringBuilder();
if(digits==null ||digits.length()==0){
return res;
}
backtracking(digits,path);
return res;
}
private void backtracking(String digits, StringBuilder path){
if(path.length() == digits.length()){
res.add(path.toString());
return;
}
int cur = digits.charAt(path.length()) - '0'; // "23" 取出char 2, -'0'转换成int
String curLetters = numString[cur];//"abc"
//开始对abc横向
for(char c:curLetters.toCharArray()){
path.append(c);
backtracking(digits,path);
path.deleteCharAt(path.length()-1);
}
}
}