目录
🎈LeetCode216.组合总和|||
✨剪枝优化
🎈LeetCode17.电话号码的字母组合
🎈LeetCode216.组合总和|||
链接:216.组合总和|||
找出所有相加之和为
n
的k
个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回
List<List<Integer>> result;
List<Integer> path;
int sum=0;
public List<List<Integer>> combinationSum3(int k, int n) {
result=new ArrayList<>();
path=new ArrayList<>();
backtracking(k,n,1);
return result;
}
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<=path.size()-k+10;i++){
path.add(i);
sum+=i;
backtracking(k,n,i+1);
sum-=i;
path.remove(path.size()-1);
}
}
✨剪枝优化
List<List<Integer>> result;
List<Integer> path;
int sum=0;
public List<List<Integer>> combinationSum3(int k, int n) {
result=new ArrayList<>();
path=new ArrayList<>();
backtracking(k,n,1);
return result;
}
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<=path.size()-k+10;i++){ //剪枝
path.add(i);
sum+=i;
if(sum>n){ //剪枝
sum-=i;
path.remove(path.size()-1);
return;
}
backtracking(k,n,i+1);
sum-=i;
path.remove(path.size()-1);
}
}
🎈LeetCode17.电话号码的字母组合
链接:17.电话号码的字母组合
给定一个仅包含数字
2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
String[] letter={" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
List<String> result;
StringBuilder str=new StringBuilder();
public List<String> letterCombinations(String digits) {
result=new ArrayList<>();
if(digits.length()==0){
return result;
}
backtracking(digits,0);
return result;
}
public void backtracking(String digits,int index){
if(index==digits.length()){
result.add(str.toString());
return;
}
int digit=digits.charAt(index)-'0';
String let=letter[digit];
for(int i=0;i<let.length();i++){
str.append(let.charAt(i));
backtracking(digits,index+1);
str.deleteCharAt(str.length() - 1);
}
}