77. 组合
77. 组合 - 力扣(LeetCode)
class Solution {
List<Integer> path = new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
public void backTracking(int n,int k,int startIndex){
if(path.size() == k){
result.add(new ArrayList(path));
return;
}
for(int i = startIndex;i <= n;i++){//剪枝:i <= n - (k - path.size()) + 1
path.add(i);
backTracking(n,k,i+1);
path.remove(path.size()-1);
}
}
public List<List<Integer>> combine(int n, int k) {
backTracking(n,k,1);
return result;
}
}
题目链接/文章讲解:代码随想录
视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili
剪枝操作:带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili
216.组合总和III
题目链接/文章讲解:代码随想录
视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili
class Solution {
int sum = 0;
List<Integer> path = new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
public void backTracking(int k ,int n,int startIndex){
if(path.size() == k){
if(sum == n)result.add(new ArrayList(path));
return;
}
for(int i = startIndex;i <= 9 - (k - path.size())+1;i++){
path.add(i);
sum += i;
backTracking(k,n,i+1);
path.remove(path.size()-1);
sum -= i;
}
}
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(k,n,1);
return result;
}
}
17.电话号码的字母组合
题目链接/文章讲解:代码随想录
视频讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibili
class Solution {
StringBuilder path = new StringBuilder();
List<String> res = new ArrayList<>();
public void backTracking(String digits,String[] numString,int index){
if(index == digits.length()){
res.add(path.toString());
return;
}
String str = numString[digits.charAt(index) - '0'];//找到数字映射的字母
for(int i = 0;i < str.length();i++){
path.append(str.charAt(i));//遍历各个字母
backTracking(digits,numString,index + 1);//对下个数字进行相同的步骤
path.deleteCharAt(path.length()-1);//回溯
}
}
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0)return res;
String[] numString = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//数字和字母的关系
backTracking(digits,numString,0);
return res;
}
}