内容:
- 组合总和III(216)
- 电话号码的字母组合(17)
1. 组合总和 III
难度:🔥🔥
建议:如果把组合问题理解了,本题就容易一些了
1.1 思路分析
此题与组合问题类似。
本题k
相当于树的深度,而9则是树的宽度
1.2 代码实现
class Solution {
LinkedList<Integer> path = new LinkedList<>();
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(n,0,k,1);
return result;
}
/**
*
* @param targetSum 目标和
* @param sum 当前总和
* @param k 一共需要k个数
* @param startIndex 开始添加的数
*/
private void backtracking(int targetSum,int sum,int k,int startIndex){
//剪枝
if (targetSum < sum) {
return;
}
//终止条件
if (k == path.size()) {
if(targetSum == sum){
result.add(new ArrayList<>(path));
}
return;
}
for(int i = startIndex;i <= 9 - (k - path.size()) + 1;i++){
sum += i;
path.add(i);
backtracking(targetSum,sum,k,i + 1);
sum -= i;
path.removeLast();
}
}
}
1.3 注意事项
1.4 收获总结
2. 电话号码的字母组合
难度:🔥🔥🔥
建议:本题大家刚开始做会有点难度,先自己思考
20min
,没思路就直接看题解
1.1 思路分析
这题是求不同集合之间的组合。同时要处理数字与字母的映射以及for
循环的条件
如图:
![17. 电话号码的字母组合](https://img-blog.csdnimg.cn/20201123200304469.png)
1.2 代码实现
class Solution {
//定义全局常量
List<String> result = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if (digits.length() == 0 || digits == null) {
return result;
}
String[] numString = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
backtracking(digits,numString,0);
return result;
}
StringBuilder temp = new StringBuilder();
//数字对应的字母String列表
/**
*
* @param digits 给定的字符数组
* @param numString 数字对应的字符串数组
* @param num 遍历了几个数字
*/
private void backtracking(String digits,String[] numString,int num){
if(num == digits.length()){
result.add(temp.toString());
return;
}
//得到数字对应的字符串列表
String str = numString[digits.charAt(num) - '0'];
for(int i = 0;i < str.length();i++){
temp.append(str.charAt(i));
backtracking(digits,numString,num + 1);
//回溯查看是否还有字母可以连接
//temp.length() 写 str.length()是不对的
temp.deleteCharAt(temp.length() - 1);
}
}
}