2023.4.8 组合总和Ⅲ
如何才能算出他们的相加值?
使用一个变量来记录
不使用剪枝的话会导致时间复杂度过高,如何才能使用剪枝操作?
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(k,n,1,0);
return res;
}
public void backTracking(int k,int n,int start,int sum){
if(sum > n){
//直接停止递归,然后回溯
return;
}
if(path.size() == k && sum == n){
res.add(new ArrayList(path));
return;
}
else if(path.size() == k){
return;
}
for(int i = start;i<=9-(k-path.size()) + 1;i++){
sum += i;
path.add(i);
backTracking(k,n,i+1,sum);
sum -= i;
path.removeLast();
}
}
}
我们所做的剪枝操作,一是当我们的sum之和大于了n时,后面的无需再进行递归了,直接返回即可
而是经典的组合中的剪枝操作,就是当我们的结果集还需要加入的元素个数与目标集合剩余元素个数不匹配时,也不进行递归了。
即经典的 i < n - ( k - path.size()) + 1
2023.4.9 电话号码的字母组合
问题:如何根据给出的字符串中的数组来构建我们的目标英文集合?
使用hashMap构建
class Solution {
List<String> res = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if(digits.length() == 0){
return res;
}
//构建一个hashMap来存放字母和数字的映射
HashMap<Character,String> phoneNum = new HashMap<>(){{
put('2',"abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
backTracking(digits,phoneNum,0,new StringBuilder());
return res;
}
public void backTracking(String digits,HashMap<Character,String> phoneNum,int index,StringBuilder temp){
//终止条件:index的作用就是让我们记录下来temp已经传入了几个字母了。如果因为是从0开始的,所以如果index+1 的长度与我峨嵋你digits的长度相等,代表我们传入的字母数已经足够了,不需要再传入了。直接回溯即可。
if(index == digits.length()){
res.add(temp.toString());
return;
}
//获取到传入字符对应的字母集合
char digit = digits.charAt(index);
String letters = phoneNum.get(digit);
for(int i = 0;i<letters.length();i++){
temp.append(letters.charAt(i));
backTracking(digits,phoneNum,index+1,temp);
//回溯
temp.deleteCharAt(index);
}
}
}