今天的题型与昨天的类似
216:组合总和 III
这个是昨天那个的翻版,加一个条件即可。但是必须剪枝否则就溢出了这里的9对应着上道题的n
代码如下:
public List<List<Integer>> re = new ArrayList();
public List<Integer> path = new ArrayList();
int sum = 0;
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(k,n,1);
return re;
}
public void backTracking(int k,int n,int startNum){
if(sum>n) return;
if(path.size()==k){
if(sum==n)re.add(new ArrayList<>(path));
return;
}
for(int i = startNum;i<=9-(k-path.size())+1;i++){
path.add(i);
sum+=i;
backTracking(k,n,i+1);
sum -= path.get(path.size()-1);
path.remove(path.size()-1);
}
return;
}
17:电话号码的字母组合
用map映射是我没有想到的真该死啊。按照传进来的字符串的每个字符去取map映射里的字符串然后遍历。代码如下:
List<String> re = new ArrayList();
StringBuffer path = new StringBuffer();
public List<String> letterCombinations(String digits) {
if(digits.length()==0) return re;
Map<Character, String> phoneMap = new HashMap<Character, String>() {{
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,0,phoneMap);
return re;
}
public void backTracking(String digits,int index,Map<Character, String> phoneMap){
if(index==digits.length()){
re.add(path.toString());
return;
}
String tool = phoneMap.get(digits.charAt(index));
for(int i=0;i<tool.length();i++){
path.append(tool.charAt(i));
backTracking(digits,index+1,phoneMap);
path.deleteCharAt(path.length()-1);
}
return;
}