216 组合总和Ⅲ
题目链接:216 组合总和Ⅲ
解题思路:可以直接用回溯暴力
代码如下:
class Solution {
private List<List<Integer>> result=new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
List<Integer> oneofresult=new ArrayList<Integer>();
backtrack(k,k,n,1,oneofresult);
return result;
}
public void backtrack(int num,int k,int n,int index,List<Integer> oneofresult){
if(n==0){
if(oneofresult.size()==num){
result.add(new ArrayList<Integer>(oneofresult));
}
return;
}
if(k==0){
if(n==0){
result.add(new ArrayList<Integer>(oneofresult));
}
return;
}
for(int i=index;i<=9;i++){
oneofresult.add(i);
backtrack(num,k-1,n-i,i+1,oneofresult);
oneofresult.remove(oneofresult.size()-1);
}
}
}
剪枝操作
个数大于规定个数或总和大于规定总和时进行剪枝
17电话号码的字母组合
题目链接: 17电话号码的字母组合
这里注意不用遍历digits 否则会多出以3中字母开头的答案
class Solution {
private List<String> result=new ArrayList<String>();
private List<String> nums=new ArrayList<String>();
public List<String> letterCombinations(String digits) {
nums.add("abc");//2
nums.add("def");//3
nums.add("ghi");//4
nums.add("jkl");//5
nums.add("mno");//6
nums.add("pqrs");//7
nums.add("tuv");//8
nums.add("wxyz");//9
StringBuffer oneofresult=new StringBuffer();
if(digits.length()==0){
return result;
}
backtrack(digits,oneofresult,0);
return result;
}
public void backtrack(String digits,StringBuffer oneofresult,int index){
if(oneofresult.length()==digits.length()){
result.add(new String(oneofresult));
return;
}
char num=digits.charAt(index);
int intnum=new Integer(num);
String letter=nums.get(intnum-50);
for(int j=0;j<letter.length();j++){
oneofresult.append(letter.charAt(j));
backtrack(digits,oneofresult,index+1);
oneofresult.deleteCharAt(oneofresult.length()-1);
}
}
}
注意参数的定义!