力扣爆刷第123天之回溯五连刷

力扣爆刷第123天之回溯五连刷

文章目录

      • 力扣爆刷第123天之回溯五连刷
      • [一、77. 组合](#一、77. 组合)
      • [二、216. 组合总和 III](#二、216. 组合总和 III)
      • [三、17. 电话号码的字母组合](#三、17. 电话号码的字母组合)
      • [四、39. 组合总和](#四、39. 组合总和)
      • [五、40. 组合总和 II](#五、40. 组合总和 II)

一、77. 组合

题目链接:https://leetcode.cn/problems/combinations/description/

思路:元素无重,不可复用,求组合数,可以早停。常规做法套模板。

java 复制代码
class Solution {
    List<List<Integer>> resList = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n, k, 1);
        return resList;
    }
    
    void backTracking(int n, int k, int start) {
        if(list.size() == k) {
            resList.add(new ArrayList(list));
            return;
        }
        for(int i = start; i <= n && n - (k - list.size()) + 1 >= i; i++) {
            list.add(i);
            backTracking(n, k, i+1);
            list.remove(list.size()-1);
        }
    }
}

二、216. 组合总和 III

题目链接:https://leetcode.cn/problems/combination-sum-iii/description/

思路:元素无重,不可复选,要求和为n的k个数的组合,只需要简单的判断和早停,其他套模板。

java 复制代码
class Solution {
    List<List<Integer>> resList = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    int sum = 0;
    public List<List<Integer>> combinationSum3(int k, int n) {
        if(k > n) return resList;
        backTracking(k, n, 1);
        return resList;
    }

    void backTracking(int k, int n, int start) {
        if(sum == n && list.size() == k) {
            resList.add(new ArrayList(list));
            return;
        }
        for(int i = start; i <= 9 && sum + i <= n; i++) {
            list.add(i);
            sum += i;
            backTracking(k, n, i+1);
            sum -= i;
            list.remove(list.size()-1);
        }
    }
    
}

三、17. 电话号码的字母组合

题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/

思路:集合无重,元素不可复用,本题不同的点是所使用的集合是可以变化的,每次向下递归需要更换下一个集合。

java 复制代码
class Solution {
    List<String> list = new ArrayList<>();
    StringBuilder builder = new StringBuilder();
    String[] source = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    public List<String> letterCombinations(String digits) {
        if(digits.equals("")) return list;
        backTracking(0, digits);
        return list;
    }
    
    void backTracking(int start, String digits) {
        if(builder.length() == digits.length()) {
            list.add(builder.toString());
            return;
        }
        String temp = source[digits.charAt(start) - '0'];
        for(int i = 0; i < temp.length(); i++) {
            builder.append(temp.charAt(i));
            backTracking(start+1, digits);
            builder.deleteCharAt(builder.length()-1);
        }
    }
}

四、39. 组合总和

题目链接:https://leetcode.cn/problems/combination-sum/description/

思路:集合无重,元素可复选,求和为K的组合数,向下递归索引位置为i不用加1,确保单个元素可以复选,排序后可以早停。其他套模板。

java 复制代码
class Solution {
    List<List<Integer>> resList = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    int sum = 0;
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
        backTracking(candidates, target, 0);
        return resList;
    }
    
    void backTracking(int[] candidates, int target, int start) {
        if(sum == target) {
            resList.add(new ArrayList(list));
            return;
        }
        for(int i = start; i < candidates.length && sum + candidates[i] <= target; i++) {
            sum += candidates[i];
            list.add(candidates[i]);
            backTracking(candidates, target, i);
            sum -= candidates[i];
            list.remove(list.size()-1);
        }
    }
    
}

五、40. 组合总和 II

题目链接:https://leetcode.cn/problems/combination-sum-ii/description/

思路:集合元素有重,不可复选,求和为K的组合数,数组和排序,排序后,纵向不去重,横向去重,横向只需要大于初始索引,前后两个值想对,即去重。其他一样。

java 复制代码
class Solution {
    List<List<Integer>> resList = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    int sum = 0;
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        backTracking(candidates, target, 0);
        return resList;
    }

    void backTracking(int[] candidates, int target, int start) {
        if(sum == target) {
            resList.add(new ArrayList(list));
            return;
        }
        for(int i = start; i < candidates.length && sum + candidates[i] <= target; i++) {
            if(i > start && candidates[i] == candidates[i-1]) continue;
            sum += candidates[i];
            list.add(candidates[i]);
            backTracking(candidates, target, i+1);
            sum -= candidates[i];
            list.remove(list.size()-1);
        }
    }
    
}
相关推荐
Lris-KK几秒前
【Leetcode】高频SQL基础题--1341.电影评分
sql·leetcode
B612 little star king9 分钟前
力扣29. 两数相除题解
java·算法·leetcode
野犬寒鸦10 分钟前
力扣hot100:环形链表(快慢指针法)(141)
java·数据结构·算法·leetcode·面试·职场和发展
时光追逐者15 分钟前
C# 哈希查找算法实操
算法·c#·哈希算法
Jasmine_llq39 分钟前
《P3825 [NOI2017] 游戏》
算法·游戏·枚举法·2-sat 算法·tarjan 算法·邻接表存储
Miraitowa_cheems42 分钟前
LeetCode算法日记 - Day 38: 二叉树的锯齿形层序遍历、二叉树最大宽度
java·linux·运维·算法·leetcode·链表·职场和发展
wangzy198243 分钟前
图形基础算法:如何将点与带曲线边的多边形位置关系算法做稳定
算法
艾醒1 小时前
探索大语言模型(LLM):Ollama快速安装部署及使用(含Linux环境下离线安装)
人工智能·深度学习·算法
艾醒1 小时前
探索大语言模型(LLM):Open-WebUI的安装
人工智能·算法·全栈
猫天意2 小时前
【CVPR2023】奔跑而非行走:追求更高FLOPS以实现更快神经网络
人工智能·深度学习·神经网络·算法·机器学习·卷积神经网络