LeetCode Day25 216&17

81 阅读1分钟

216. 组合总和 III

  1. 和77题一样需要一维数组path来存放符合条件的结果,二维数组result来存放结果集。这里startIndex为下一层for循环搜索的起始位置,sum为需要求的目标和,算上需要传入的n、k我们可以确定回溯的传参了: backtracing(int n, int k, int startIndex, int sum)
  2. 接着确定终止条件,k其实就已经限制树的深度,因为就取k个元素,树再往下深了没有意义。所以如果path.size() 和 k相等了,就终止。因此if(sum == n && k == path.size()){终止条件}
  3. 最后是单层搜索的过程:这里需要注意n因为最多是9,所以剪枝优化的时候是9 - (k - path.size()) + 1,同时注意i+1调整startIndex,最后回溯。
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combinationSum3(int k, int n) {
        backtracing(n, k, 1, 0);
        return res;
    }

    public void backtracing(int n, int k, int startIndex, int sum){
        if(sum > n) return;

        if(sum == n && k == path.size()){
            res.add(new ArrayList(path));
        }

        for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i ++){
            path.add(i);
            sum += i;
            backtracing(n, k, i + 1, sum);
            sum -= i;
            path.removeLast();
        }
    }
}

17. 电话号码的字母组合

class Solution {
    List<String> list = new ArrayList<>();
    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;
    }

    StringBuilder temp = new StringBuilder();
    public void backTracking(String digits, String[] numString, int num){
        if(num == digits.length()){
            list.add(temp.toString());
            return;
        }
        String str = numString[digits.charAt(num) - '0'];
        for(int i = 0; i < str.length(); i ++){
            temp.append(str.charAt(i));
            backTracking(digits, numString, num+1);
            temp.deleteCharAt(temp.length() - 1);
        }
    }
}