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()) + 1path.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;}
}