學習目標:
- 216.組合總和III
- 17.電話號碼的字母組合
學習內容:
216.組合總和III
題目鏈接 &&文章講解
找出所有相加之和為 n 的 k 個數的組合,且滿足下列條件:
- 只使用數字1到9
- 每個數字 最多使用一次
返回所有可能的有效組合的列表 。該列表不能包含相同的組合兩次,組合可以以任何順序返回。
class Solution {List<List<Integer>> result= new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {backtracking(n,k,0, 1);return result;}//1.遞歸函數參數以及返回值public void backtracking(int targetSum, int k, int sum, int startIndex){//2.剪枝操作:sum > targetSum 確定終止條件:path.size == kif(sum > targetSum) return;if(path.size() == k){if(targetSum == sum){result.add(new ArrayList<>(path));return;}}//3.單層處理邏輯//剪枝操作:i < 9 - (k - path.size()) + 1for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i++){sum += i;path.add(i);backtracking(targetSum, k, sum, i + 1);sum -= i;path.removeLast();}}
}
17.電話號碼的字母組合
題目鏈接&&文章講解
給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。答案可以按 任意順序 返回。
給出數字到字母的映射如下(與電話按鍵相同)。注意 1 不對應任何字母。
class Solution {//存儲最終結果List<String> list = new ArrayList<>();//存儲每次迭代字符串StringBuilder str = new StringBuilder();public List<String> letterCombinations(String digits) {if (digits == null || digits.length() == 0) {return list;}//數字-字母映射String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};backTracking(digits, numString, 0);return list;}//樹形結構深度:digits.length() 樹形結構寬度:letter.lengthpublic void backTracking(String digits, String[] numString, int index){if(index == digits.length()){list.add(str.toString());return;}String letter = numString[digits.charAt(index) - '0'];for(int i = 0; i < letter.length(); i++){str.append(letter.charAt(i));backTracking(digits, numString, index + 1);str.deleteCharAt(str.length() - 1);}}
}