LeetCode 216 组合总和III
题目链接:216.组合总和III
【解题思路】
【剪枝】如果sum大于targetSum,直接return
【剪枝】当我们剩余未遍历的元素个数满足不了我们所需要的元素个数,我们就没必要遍历了
【解题步骤】
-
主函数部分:
-
【全局变量】二维数组result收集结果集
-
【全局变量】一维数组path表示当前路径
-
调用递归函数,传入n,k,1
-
return result
-
-
递归函数部分:
-
1.确定参数和返回值:
-
返回值:
- void
-
参数:
-
需要求的组合里的和targetSum
-
单个组合的大小k
-
收集当前路径已有的和sum
-
控制当前递归层的起始位置startIndex
-
-
-
2.确定终止条件:
-
如果我们路径上的元素等于给定的k
-
1)如果在叶子节点中发现了符合条件的元素
- 将结果放进结果集
-
2)return
-
-
-
3.确定单层处理逻辑:
-
循环遍历当前单层搜索,从startIndex当前位置开始:
-
每取一个数,就将其累加到sum
-
将当前元素放入路径集合path
-
递归,将targetSum,k , sum , i + 1传入
-
回溯,将累加到sum的数减掉,将放入路径集合path的元素弹出
-
-
-
【代码部分】
java:
java
class Solution {
List<List<Integer>>ans = new ArrayList<>();
LinkedList<Integer>path = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(k,n,1,0);
return ans;
}
public void backTracking(int k , int n , int starIndex , int sum){
if(sum > n)return;
if(sum == n && path.size() == k){
ans.add(new ArrayList<>(path));
return;
}
for(int i = starIndex ; i <= 9 - (k - path.size()) + 1 ; i++){
path.add(i);
sum += i;
backTracking(k,n,i + 1,sum);
sum -= i;
path.removeLast();
}
}
}
LeetCode 17 电话号码的字母组合
题目链接:17.电话号码的字母组合
【解题思路】
用map或者二维数组来映射每一个数字对应的字符串,输出每一个可能的组合
【解题步骤】
-
主函数部分:
-
【全局变量】字符串string s表示当前路径下的单个结果
-
【全局变量】result数组用来存放结果集
-
定义一个字符串numString,模拟键盘0-9所代表的字符串
-
调用递归函数,传入digits,numString,0
-
return result
-
-
递归函数部分:
-
1.确定参数和返回值:
-
返回值:
- void
-
参数:
-
初始对应的2-9数字所表示的字符串numString
-
传入的字符串string digits
-
记录当前递归遍历到的字母下标index
-
-
-
2.确定终止条件:
-
如果index等于我们传入的字符串digits长度,说明遍历结束
- 将当前的s放入结果集result里,然后return
-
-
3.确定单层处理逻辑:
-
1)将当前传入的字符串转变为相应的数字
-
2)获取当前数字对应的字符串
-
3)遍历对应的字符串:
-
将当前字符取出到s中
-
递归,调用函数,传入digits和index+1
-
回溯,将当前字符从s中弹出
-
-
-
【代码部分】
java:
java
class Solution {
List<String> result = new ArrayList<>();
StringBuilder s = new StringBuilder();
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0)return result;
String[] numString = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
bacKTracking(digits,numString,0);
return result;
}
public void bacKTracking(String digits, String[] numString , int index) {
if (index == digits.length()) {
result.add(s.toString());
return;
}
//将当前传入的字符串转为相应的数字
int temp = digits.charAt(index) - '0';
//用一个str获取当前数字对应的字符串
String str = numString[temp];
//遍历对应字符串
for (int i = 0; i < str.length(); i++) {
//将当前字符取出到s中
s.append(str.charAt(i));
//递归,调用函数
bacKTracking(digits, numString, index + 1);
//回溯,将当前字符从s中弹出
s.deleteCharAt(s.length() - 1);
}
}
}