leetcode

代码随想录计划

Day 22–回溯算法

组合总和 III

组合总和 III

昨天做过组合,这题延续思路不难做出:

class Solution {
    private List<List<Integer>> result;
    private List<Integer> list;
    public List<List<Integer>> combinationSum3(int k, int n) {
        result = new LinkedList<>();
        if(n > 45) return result;
        list = new LinkedList<>();
        backtracking(k,n,1);
        return result;

    }
    public void backtracking(int k, int n,int start){
        if(list.size() == k && n == 0){
            result.add(new LinkedList(list));
            return;
        }
        for(int i = start;i<=9;i++){
            list.add(i);
            backtracking(k,n-i,i+1);
            list.remove(list.size()-1);
        }
    }
}

其他就是增加一些剪枝的操作

class Solution {
    private List<List<Integer>> result;
    private List<Integer> list;
    public List<List<Integer>> combinationSum3(int k, int n) {
        result = new LinkedList<>();
        if(n > 45) return result;
        list = new LinkedList<>();
        backtracking(k,n,1);
        return result;

    }
    public void backtracking(int k, int n,int start){
        if(n<0) return;
        if(list.size() == k && n == 0){
            result.add(new LinkedList(list));
            return;
        }
        for(int i = start;i<=9-(k-list.size())+1;i++){
            list.add(i);
            backtracking(k,n-i,i+1);
            list.remove(list.size()-1);
        }
    }
}
电话号码的字母组合

电话号码的字母组合

这题涉及到了两个数组 一个是号码数组,一个是号码对应的字母数组。一开始想看能不能想出一个哈希函数直接算出每个号码对应字符串的映射。但是看题解还是直接定义一个map容易些。

class Solution {
    private List<String> result;
    private static String[] map = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    public List<String> letterCombinations(String digits) {
        result = new LinkedList<>();
        if(digits.length() == 0) return result;
        StringBuilder str = new StringBuilder();
        backtracking(str,0,digits);
        return result;
    }
    public void backtracking(StringBuilder str,int index,String digits){
        if(index == digits.length()){
            result.add(new String(str));
            return;
        }
        int k = digits.charAt(index) - '0';
        String cur = map[k];
        for(int i = 0;i<cur.length();i++){
            str.append(cur.charAt(i));
            backtracking(str,index+1,digits);
            str.deleteCharAt(str.length()-1);
        }
    }

你可能感兴趣的:(leetcode)