首页 > 编程语言 >代码随想录算法训练营第二十四天 二十五 | 回溯的理论基础,77. 组合 216. 组合总和 III 17. 电话号码的字母组合

代码随想录算法训练营第二十四天 二十五 | 回溯的理论基础,77. 组合 216. 组合总和 III 17. 电话号码的字母组合

时间:2024-04-05 14:12:50浏览次数:36  
标签:map return 组合 int res 随想录 new 字母组合 path

77. 组合
https://leetcode.cn/problems/combinations/description/

List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
        backtracking(n,k,1);
        return res;
    }
    public void backtracking(int n, int k,int start){
        if (path.size() == k){
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = start;i <= n ;i++){
            path.add(i);
            backtracking(n,k,i+1);
            path.remove(path.size() - 1);
        }
    }

总结:回溯,每次选一个点,for中是这一横层的选点,选完了把下一个点放进去,放完了拿出来。
216. 组合总和 III
https://leetcode.cn/problems/combinations/description/

List<List<Integer>> res;
    List<Integer> path;
    public List<List<Integer>> combinationSum3(int k, int n) {
        res = new ArrayList<>();
        path = new ArrayList<>();
        backtracking(k,n,1);
        return res;
    }
    public void backtracking(int k,int n,int start){
        if (path.size() > k) return;//这句话就是剪枝优化
        if (path.size() == k){
            int count = 0;
            for (Integer integer : path) {
                count += integer;
            }
            if (count == n){
                res.add(new ArrayList<>(path));
                return;
            }else {
                return;
            }
        }
        for (int i = start; i <= 9; i++) {
            path.add(i);
            backtracking(k,n,i+1);
            path.remove(path.size() - 1);
        }
    }

总结:回溯,每次长度够了就看值是否符合,长度超了就直接return
17. 电话号码的字母组合
https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/

List<String> res;
    StringBuilder path;
    HashMap<Integer,String> map;
    int digitsLen;
    public List<String> letterCombinations(String digits) {
        res = new ArrayList<>();
        path = new StringBuilder();
        map = new HashMap<>();
        if (digits.isEmpty()) return res;
        map.put(2,"abc");
        map.put(3,"def");
        map.put(4,"ghi");
        map.put(5,"jkl");
        map.put(6,"mno");
        map.put(7,"pqrs");
        map.put(8,"tuv");
        map.put(9,"wxyz");
        digitsLen = digits.length();
        backtracking(0,digits);
        return res;
    }
    public void backtracking(int num,String digits){
        if (path.length() == digitsLen){
            res.add(path.toString());
            return;
        }
        int key = digits.charAt(num) - '0';
        String str = map.get(key);
        for (int i = 0; i < str.length(); i++) {
            path.append(str.charAt(i));
            backtracking(num+1,digits);
            path.deleteCharAt(path.length()-1);
        }
    }

总结:用回溯,先把每个数字和对应的字符串存到map中,再去遍历字符串的每个位置的数字,取出对应的str,把str进行回溯。

标签:map,return,组合,int,res,随想录,new,字母组合,path
From: https://www.cnblogs.com/jeasonGo/p/18115699

相关文章

  • ·跟着代码随想录刷力扣· ·数组部分· 2. 二分法
    leetcode题目:704二分法一、回顾顺序搜索(一)无序列表的顺序搜索,时间复杂度O(n)defsearch(self,nums:List[int],target:int)->int:pos=0whilepos<len(nums):ifnums[pos]==target:returnpos......
  • 代码随想录算法训练营第二天 | 数组 977.有序数组的平方
    leetcode977.有序数组的平方题目977.有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[0,1,9......
  • langchain + azure chatgpt组合配置并运行
    首先默认你已经有了azure的账号。最重要的是选择gpt-35-turbo-instruct模型、api_version:2023-05-15,就这两个参数谷歌我尝试了很久才成功。我们打开https://portal.azure.com/#home,点击更多服务: 我们点击AzureOpenAI: 再点击创建: azure访问有点慢,我们等一会后会......
  • 代码随想录第30天|51. N皇后
    51. N皇后51.N皇后-力扣(LeetCode)代码随想录(programmercarl.com)这就是传说中的N皇后?回溯算法安排!|LeetCode:51.N皇后_哔哩哔哩_bilibili按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在......
  • 代码随想录第29天|491.递增子序列 46.全排列 47.全排列 II
    目录:491.递增子序列46.全排列47.全排列II 491.递增子序列491.非递减子序列-力扣(LeetCode)代码随想录(programmercarl.com)回溯算法精讲,树层去重与树枝去重|LeetCode:491.递增子序列_哔哩哔哩_bilibili给你一个整数数组 nums ,找出并返回所有该数组中不同的递......
  • 代码随想录算法训练营第一天 | 704.二分查找、27.移除元素
    704.二分查找文档讲解:代码随想录(https://www.programmercarl.com/)视频讲解:https://www.bilibili.com/video/BV1fA4y1o715/状态:704有思路但是不完善题目给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下......
  • CMT313个人投资组合评估方法
    课程评估形式模块代码:CMT313课程名称:软件工程评估题目:个人投资组合评估编号:第3个,共3个日期设置:19/02/2024提交日期和时间:春季工作周,2024年5月2日上午9:30反馈返回日期:2024年6月5日如果您因情有可原的情况获得延期,那么提交截止日期和返回日期将晚于上述日期。当您的延期获得批准时,......
  • 代码随想录算法训练营第二十一天| 530. 二叉搜索树的最小绝对差 501. 二叉搜索树中的
    530.二叉搜索树的最小绝对差https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/TreeNodepre=null;intres=Integer.MAX_VALUE;publicintgetMinimumDifference(TreeNoderoot){if(root==null)return0;pr......
  • 代码随想录DAY1 | 二分,双指针移除元素
    代码随想录DAY1|二分,双指针移除元素题目描述给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且......
  • 代码随想录算法训练营第一天 | 数组 704.二分查找 27.移除元素
    leetcode704.二分查找题目704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。解题思路代码实现本题对自己的难点有大概的解题思路,但是代码实现有几个点写不出来1、怎么取......