Day22 77. 组合 | 216. 组合总和 III | 17. 电话号码的字母组合

41 阅读1分钟

77. 组合 - 力扣(LeetCode)

class Solution {
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> result = new ArrayList<>();
        backtrack(1,new ArrayList<>(),n,k,result);
        return result;
    }

    private void backtrack(int start,List<Integer> lis,int n,int k,List<List<Integer>> result){
        if(lis.size() == k){
            result.add(new ArrayList<>(lis));
            return;
        }
        for(int i = start;i <= n;i++){
            lis.add(i);
            backtrack(i+1,lis,n,k,result);
            lis.remove(lis.size()-1);
        }
    }
}

216. 组合总和 III - 力扣(LeetCode)

class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> ans = new ArrayList<>();
        List<Integer> path = new ArrayList<>(k);
        dfs(9, n, k, ans, path);
        return ans;
    }

    private void dfs(int i, int t, int k, List<List<Integer>> ans, List<Integer> path) {
        int d = k - path.size();// 还要选d个数
        if (t < 0 || t > (i * 2 - d + 1) * d / 2) {
            return;
        }
        if (d == 0) {
            ans.add(new ArrayList<>(path));
            return;
        }
        for (int j = i; j >= d; j--) {
            path.add(j);
            dfs(j - 1, t - j, k, ans, path);
            path.remove(path.size() - 1);
        }
    }
}

17. 电话号码的字母组合 - 力扣(LeetCode)

class Solution {
    private static final String[] MAPPING = new String[] {
            "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"
    };

    private final List<String> ans = new ArrayList<>();
    private char[] digits;
    private char[] path;

    public List<String> letterCombinations(String digits) {
        int n = digits.length();
        if (n == 0) {
            return List.of();
        }

        this.digits = digits.toCharArray();
        path = new char[n]; // 本题path长度固定为n
        dfs(0);
        return ans;
    }

    private void dfs(int i) {
        if (i == digits.length) {
            ans.add(new String(path));
            return;
        }
        for (char c : MAPPING[digits[i] - '0'].toCharArray()) {
            path[i] = c; // 直接覆盖
            dfs(i + 1);
        }
    }
}