首页 > 编程语言 >Day 22 回溯算法 part01

Day 22 回溯算法 part01

时间:2024-07-24 23:50:34浏览次数:8  
标签:tmp digits return 22 part01 int new Day backTracking

77. 组合

我的这个解法还算挺简单易懂的,还是看注释

class Solution {
    List<List<Integer>> ans = new ArrayList(); //存储最终结果集合
    List<Integer> tmp = new ArrayList(); //记录单次的path
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n, k);
        return ans;
    }

    public void backTracking(int n, int k){ //从1~n挑选k个数组合的方法
        if(n < k) return;  //若k > n 显然,不存在这样的组合
        if(k == 1){  //从n个数中挑选一个
            for(int i = n; i > 0; i--){  //对于1~n任选一个添加到结果中即可
                tmp.add(i);
                ans.add(new ArrayList(tmp));
                tmp.remove(tmp.size()-1); //回溯
            }
            return;
        }
        //这里也可以添加剪枝,即n == k的时候,直接放入结果即可
        //k > 1的情况,还可以分成两种
        //1. 选择n,再从n-1中选择k-1个数字
        tmp.add(n);
        backTracking(n-1, k-1);
        tmp.remove(tmp.size()-1);
		//2. 不选n,从n-1中选择k个即可
        backTracking(n-1, k);
    }
}

216. 组合总和 III

与上一题的做法差不太多,但是剪枝的操作我考虑的并不完整。这里使用

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

    public void backTracking(int start, int k, int sum){ //start代表了现在可以取的第一个数字
        // sum代表了还需要加多少才能符合条件
        if(path.size() > k || sum < 0) return; //sum < 0 代表当前组合的和大于目标值了
        if(path.size() == k) {
            if(sum == 0) ans.add(new ArrayList(path));
            return;
        }
        for(int i = start; i <= 9; i++){ //所有的回溯都可以抽象成树结构(多叉树)
            //for循环相当于对每个子节点进行访问,只有访问到叶子节点才进行存储结果,也就是递归的出口
            path.add(i);
            backTracking(i+1, k, sum-i);
            path.remove(path.size()-1);
        }
    }
}

17. 电话号码的字母组合

class Solution {
    List<String> res = new ArrayList();
    StringBuilder sb = new StringBuilder();
    String[] map = new String[]{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    public List<String> letterCombinations(String digits) {
        if(digits.length() == 0) return res;
        backTracking(digits, 0);
        return res;
    }
    public void backTracking(String digits, int index){ //index代表当前要处理的数字在digits中的index
        if(sb.length() == digits.length()) {
            res.add(sb.toString());
            return;
        }
        int digit = digits.charAt(index) - '0';
        String s = map[digit];
        for(char c: s.toCharArray()){
            sb.append(c);
            backTracking(digits, index+1);
            sb.deleteCharAt(sb.length()-1);
        }
    }
}

标签:tmp,digits,return,22,part01,int,new,Day,backTracking
From: https://www.cnblogs.com/12sleep/p/18322049

相关文章

  • YC322A [ 20240724 CQYC NOIP 模拟赛 T4 ] 庫的 序计数(counting)
    题意给定一棵树\(T\),每次操作在某个点下方接上\(k\)个儿子。询问期望多少次排列,使得\(a_{fa_i}<a_i\)。保证\(k\)是偶数,对\(65536\)取模。\(n\le10^5,k\le2\times10^9\)。Sol考虑假如已经确定了一棵树的形态,如何求出最终的答案?可以发现对于每一个节点......
  • C语言学习day03
    变量概念表面:程序运行过程中取值可以改变的数据实质:变量其实代表了一块内存区域/单元/空间。变量名可视为该区域的标识。整个变量分为三部分:  变量名:这个只是变量的一个标识,我们借助变量名来存取数据。  变量空间/内存单元:这个就是内存中分配的一块用来存储数据的......
  • 2024.7.22模拟赛5
    模拟赛咕了两天才发现少了一天的题解。T1MakeItIncreasing水。code#include<bits/stdc++.h>usingnamespacestd;constintN=40;#defineLLlonglongintt,n;LLa[N];intmain(){// freopen("in.in","r",stdin);// freopen("out.out",&......
  • JAVA小白自学日记Day9
     1.序列化序列化版本号:serialVersionUID,是一个类的序列化版本号。如果在反序列化时,类的serialVersionUID与序列化时的版本号不匹配,那么会抛出 InvalidClassException 异常,表示类的版本不兼容,无法进行反序列化。如果流量没有定义,JDK会自动给与一个版本号,当该类发生变化(......
  • 上市公司-企业数据要素利用水平(2010-2022年)
    企业数据要素利用水平数据:衡量数字化时代企业竞争力的关键指标在数字化时代,企业对数据的收集、处理、分析和应用能力成为衡量其竞争力和创新能力的重要标准。企业数据要素利用水平的高低直接影响其市场表现和发展潜力。企业数据要素利用水平的测算方法本数据集参考了史青春(2......
  • 上市公司-企业投资羊群效应、投资从众行为数据(指标+计算+代码)(2000-2022年)
    上市公司企业投资羊群效应数据:揭示投资决策中的从众行为"羊群效应"在企业投资领域表现为投资者在信息不确定的情况下,倾向于模仿其他投资者的决策或过度依赖舆论,而非基于自身独立的信息进行投资。这种现象可能导致投资决策的非理性和市场效率的降低。企业投资水平的测算企业......
  • 代码随想录 day34 不同路径 | 不同路径 II
    不同路径不同路径解题思路通过动态规划,先将第一行和第一列设为1,目的是初始化dp,这样设置的理由是这些格子只有一条路能达到,接着就是遍历整个路径,每个格子所包含的路径和为其左边和上边的路径数之和,随后在目的地格子得到值。知识点动态规划心得没想到初始化的方式,导致没有实......
  • SDOI/SXOI 2022
    我记得当年好像vp过这场,但是他质量真的好高。整数序列数据范围很诈骗,但polylog做法思考无果还是指引我们来想sqrt做法。首先有一个很暴力的\(O(cnt_x+cnt_y)\)的做法。看到和出现次数有关则可以想根号分治。我们设定一个阈值\(B\),对于两者都\(<B\)的部分可以暴力......
  • 算法笔记|Day6哈希表基础II
    算法笔记|Day6哈希表基础II☆☆☆☆☆leetcode454.四数相加II题目分析代码☆☆☆☆☆leetcode383.赎金信题目分析代码☆☆☆☆☆leetcode15.三数之和题目分析代码☆☆☆☆☆leetcode18.四数之和题目分析代码☆☆☆☆☆leetcode454.四数相加II题目链接:leetco......
  • VS2022 安装.NET4.5目标包
    转载自https://www.cnblogs.com/Stay627/p/15549958.html[VS2022安装.NET4.5目标包]众所周知VS2022将不再支持.NET4.5,即使在VisualStudioInstaller中也找不到.NET4.5的选项在不改变项目结构的情况下,要么选择继续使用VS2019,当然博主已经卸掉了,那么还有什么方法呢?我们可以......