提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Leetcode
216. 组合总和 III
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
和 77.组合 相似
● 看完代码随想录之后的想法
没看
● 自己实现过程中遇到哪些困难
无
● 今日收获,记录一下自己的学习时长
很快
class Solution {
LinkedList<Integer> list = new LinkedList<>();
List<List<Integer>> result = new ArrayList<>();
int sum = 0;
public List<List<Integer>> combinationSum3(int k, int n) {
combination(k,n,1);
return result;
}
public void combination(int k, int n,int start){
if(sum > n){
return;
}
if(list.size()==k && sum == n){
result.add(new ArrayList<>(list));
return;
}
for(int i = start;i<=9;i++){
list.add(i);
sum += i;
combination(k,n,i+1);
sum -= i;
list.removeLast();
}
}
}
17. 电话号码的字母组合
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
以前都是一个集合,然后回溯遍历。今天的是两个集合的组合问题,递归时,怎样做到第一次取第一个集合的元素,第二次取第二个集合的元素的效果呢
● 看完代码随想录之后的想法
- 输入参数错误。将一个指针指向整体集合,控制遍历大集合,递归过程中,可控制第一次取第一个集合的元素,第二次取第二个集合的元素的效果
- for循环控制小集合,i指针指向这次小遍历取出的字母
● 自己实现过程中遇到哪些困难
- 用StringBuilder可以实现拼接append()和deleteCharAt()
- int s = digits.charAt(start)-‘0’; char转int 只需要 -‘0’
● 今日收获,记录一下自己的学习时长
补
class Solution {
List<String> list = new LinkedList<>();
Map<Integer,String> map = new HashMap<>();
public List<String> letterCombinations(String digits) {
if(digits.length() == 0){
return list;
}
map.put(2,"abc");
map.put(3,"def");
map.put(4,"ghi");
map.put(5,"jkl");
map.put(6,"mno");
map.put(7,"pqrs");
map.put(8,"tuv");
map.put(9,"wxyz");
combination(digits,0);
return list;
}
StringBuilder temp = new StringBuilder();
public void combination(String digits,int start){
if(start == digits.length()){
list.add(temp.toString());
return;
}
int s = digits.charAt(start)-'0';
String str = map.get(s);
if(str == null){
return;
}
for(int i=0; i<str.length(); i++){
temp.append(str.charAt(i));
combination(digits,start+1);
temp.deleteCharAt(temp.length() - 1);
}
}
}