秋招力扣Hot100刷题总结——回溯

news2024/9/19 9:16:11

回溯问题通常应用于解决排列组合等问题,需要注意的是回溯函数中的参数、结束条件、遍历开始顺序等。
回溯三部曲:
(1)确定递归函数的参数。
(2)确定递归函数的终止条件。
(3)确定单层搜索的逻辑。

1.全排列 题目链接

  • 题目要求:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
    在这里插入图片描述
  • 代码及思路
    • 使用回溯求排列
    • 回溯结束条件:当前集合的元素个数等于nums数组中元素个数
    • 在回溯的每一层中,选择当前未被使用的数字加入当前排列,使用used数组记录已经使用过的元素
    • 代码
class Solution {
    List<List<Integer>> res=new ArrayList<>();
    public List<List<Integer>> permute(int[] nums) {
        boolean[] used=new boolean[nums.length];
        backTracing(nums,used,new ArrayList<>());
        return res;
    }
    private void backTracing(int[] nums,boolean[] used,List<Integer> path){
        if(path.size()==nums.length){
            res.add(new ArrayList<>(path));
            return;
        }
        for(int i=0;i<nums.length;i++){
            if(!used[i]){
                used[i]=true;
                path.add(nums[i]);
                backTracing(nums,used,path);
                used[i]=false;
                path.remove(path.size()-1);
            }
        }
    }
}

2. 电话号码的字母组合 题目链接

  • 题目要求:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
    给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
    在这里插入图片描述
  • 代码及思路
    • 回溯的参数为输入字符串digits,电话号码对应的字符串数组,以及处理到digits中数字的顺序
    • 结束条件为:但处理到的数字的顺序大于等于digits的长度时,就可以添加到结果中并返回了
    • 回溯中循环直接从0开始,因为这是在多个不同的字符串中进行组合,不需要考虑重复问题
    • 代码
class Solution {
    List<String> res=new ArrayList<>();
    public List<String> letterCombinations(String digits) {
        if(digits.length()==0)return res;
        String[] numbers={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        backTracing(digits,0,numbers);
        return res;
    }
    StringBuilder path=new StringBuilder();
    private void backTracing(String digits,int start,String[] numbers){
        if(start>=digits.length()){
            res.add(path.toString());
            return;
        }
        String str=numbers[digits.charAt(start)-'0'];
        for(int i=0;i<str.length();i++){
            path.append(str.charAt(i));
            backTracing(digits,start+1,numbers);
            path.deleteCharAt(path.length()-1);
        }
    }
}

3. 路径总和 III(回溯+前缀和)题目链接

  • 题目要求:给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
    路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
    在这里插入图片描述
  • 代码及思路
    • 因为每个节点都可能有左右节点,因此需要回溯考虑多种情况
    • 使用前缀和来判断路径和
    • 代码
class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        if(root==null)return 0;
        Map<Long,Integer> presum=new HashMap<>();
        //注意,主要是为了考虑从根节点开始到某个节点之间的路径刚好等于target
        presum.put(0L,1);
        return dfs(root,presum,0L,targetSum);
    }
    private int dfs(TreeNode root,Map<Long,Integer> presum,Long cur,int targetSum){
        if(root==null)return 0;
        int res=0;
        cur+=root.val;
        res+=presum.getOrDefault(cur-targetSum,0);
        presum.put(cur,presum.getOrDefault(cur,0)+1);
        res+=dfs(root.left,presum,cur,targetSum);
        res+=dfs(root.right,presum,cur,targetSum);
        //回溯
        presum.put(cur,presum.get(cur)-1);
        return res;
    }
}

4. 括号生成 题目链接

  • 题目描述:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
    在这里插入图片描述
  • 代码及思路
    • 使用回溯解决问题,递归时当当前字符串的长度等于n的两倍时添加到结果集中
    • 当左括号数量小于n时,继续递归添加左括号
    • 当右括号数量小于左括号数量时递归添加右括号
    • 代码
class Solution {
    List<String> res=new ArrayList<>();
    public List<String> generateParenthesis(int n) {
        backTracing("",0,0,n);
        return res;
    }
    private void backTracing(String cur,int left,int right,int n){
        if(cur.length()==2*n){
            res.add(cur);
        }
        if(left<n){
            backTracing(cur+"(",left+1,right,n);
        }
        if(right<left){
            backTracing(cur+")",left,right+1,n);
        }
    }
    
}

5. 子集 题目链接

  • 题目要求:给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
    解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
    在这里插入图片描述
  • 代码及思路
    • 使用回溯解决问题,每次递归时起始位置加1,避免元素重复
    • 每一次递归过程都将当前的路径集合加入结果集
    • 当path的长度等于数组的个数时结束递归
    • 代码
class Solution {
    List<List<Integer>> res=new ArrayList<>(); 
    public List<List<Integer>> subsets(int[] nums) {
        backTracing(nums,0,new ArrayList<>());
        return res;
    }
    private void backTracing(int[] nums,int start,List<Integer> path){
        res.add(new ArrayList<>(path));
        if(start>=nums.length){
            return;
        }
        for(int i=start;i<nums.length;i++){
            path.add(nums[i]);
            backTracing(nums,i+1,path);
            path.remove(path.size()-1);
        }
    }
   
}

6. 组合总数 题目链接

  • 题目要求:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
    candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
    对于给定的输入,保证和为 target 的不同组合数少于 150 个。
    在这里插入图片描述
  • 代码及思路
    • 使用回溯解决,每次回溯的起始位置都是当前遍历的元素
    • 当target刚好等于0的时候将当前结果加入结果集并结束递归
    • 当target小于0时,结束递归
    • 代码
class Solution {
    List<List<Integer>> res=new ArrayList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        backTracing(candidates,0,target,new ArrayList<>());
        return res;
    }
    private void backTracing(int[] candidates,int start,int target,List<Integer> path){
        if(target==0){
            res.add(new ArrayList<>(path));
            return;
        }
        if(target<0){
            return;
        }
        for(int i=start;i<candidates.length;i++){
            path.add(candidates[i]);
            backTracing(candidates,i,target-candidates[i],path);
            path.remove(path.size()-1);
        }
    }
}

7.目标和 题目链接

  • 题目要求:给你一个非负整数数组 nums 和一个整数 target 。
    向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :
    例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。
    返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。
    在这里插入图片描述
  • 代码及思路
    • 使用回溯来解决问题
    • 首先对每一个数字可能添加的不同符号进行考虑,并对每一种情况进行递归
    • 每一个数字的返回结果是两种不同符号的和
    • 递归结束条件:遍历到数组结束
    • 代码
class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        return backTracing(nums,target,0,0);
    }
        private int backTracing(int[] nums, int target, int index, int currentSum) {
        if (index == nums.length) {
            // 当遍历完所有的数字后,判断当前的和是否等于目标值
            return currentSum == target ? 1 : 0;
        }
        // 选择将当前数字添加正号
        int add = dfs(nums, target, index + 1, currentSum + nums[index]);
        // 选择将当前数字添加负号
        int subtract = dfs(nums, target, index + 1, currentSum - nums[index]);
        // 返回两种选择的总和
        return add + subtract;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

错误:Input string was not in a correct format.

之前写的桌面端&#xff0c;在国内客户电脑运行着没问题&#xff0c;到欧洲国家电脑上就挂掉了 原因&#xff1a;TM 小数点不是. 而是, 是逗号&#xff0c;不明觉厉 解决办法&#xff1a; 1、更改客户电脑配置 这里把逗号改成.就行了 但是这种办法比较笨&#xff0c;总不能…

视频检索技术为电子商务直播领域带来了前所未有的革新

视频检测在这个场景中指的是通过视频流实时识别和检索直播中销售人员展示的商品。这涉及到从连续的视频帧中分析和识别商品的视觉内容&#xff0c;通常与语音和文本数据结合&#xff0c;以提高识别准确性。 技术原理 文本引导的注意机制&#xff1a;这一机制通过直播中销售人员…

初始redis:List

列表 List 相当于数组或者顺序表。 对于List来说&#xff0c;两侧都可以插入和删除&#xff0c;时间复杂度是O(1)。 有很多的操作&#xff0c;比如 llen 可以获取List的长度&#xff0c;lrem 可以删除元素 &#xff0c;lrange可以去一个字符串 &#xff0c; lindex可以根据下标…

MBR20100FCT-ASEMI无人机专用MBR20100FCT

编辑&#xff1a;ll MBR20100FCT-ASEMI无人机专用MBR20100FCT 型号&#xff1a;MBR20100FCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环峰值…

Leetcode344. 反转字符串(双指针-对撞)

题目描述&#xff1a; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例&#xff1a; 示例 1&#xff1a; 输…

比铁饭碗还好的专业,未来人才缺口超大,而且就业压力还小!

高考是许多学生心中的一件大事&#xff0c;高考成绩的好坏&#xff0c;直接决定着进入什么样的大学&#xff0c;或者选择什么样的专业。**而且在当今这个日新月异的时代&#xff0c;选择一个既有发展前景又相对稳定的职业成为了许多学生和家长的关注焦点。**其实我国有部分大学…

Python爬虫——简单网页抓取(实战案例)小白篇

Python 爬虫是一种强大的工具&#xff0c;用于从网页中提取数据。这里&#xff0c;我将通过一个简单的实战案例来展示如何使用 Python 和一些流行的库&#xff08;如 requests 和 BeautifulSoup&#xff09;来抓取网页数据。 实战案例&#xff1a;抓取一个新闻网站的头条新闻标…

UIAbility组件的启动模式

UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景&#xff0c;系统提供了三种启动模式&#xff1a; 1、singleton启动模式 单实例模式&#xff0c;也是默认情况下的启动模式。系统中只存在唯一一个该UIAbility实例&#xff0c;即在最近任务列…

BMS杂谈1

1、LTC凌特和ADI是一家 凌力尔特&#xff08;Linear Technology&#xff09;是一家模拟芯片公司&#xff0c;成立于1981年&#xff0c;由‌Bob Swanson和‌Bob Dobkin创立&#xff0c;总部位于硅谷。2016年&#xff0c;凌力尔特被ADI公司以约150亿美元的价格收购。收购完成后&a…

如何免费获取乡镇级边界数据geoJson数据

如何免费获取乡镇级边界数据geoJson数据 我们可以通过 阿里云数据可视化平台 &#xff0c;可以获取到中国各个省份/区级/县级的json数据&#xff0c;但是区级和县级&#xff0c;并没有包含街道和乡镇的数据 获取乡镇级边界数据 1.下载bigemap全能版 安装好后选择你要导出的…

数据链路层 III(介质访问控制)【★★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 介质访问控制所要完成的主要任务是&#xff1a;为使用介质的每个结点隔离来自同一信道上其他结点所传送的信号&#xff0c;以协调活动结点的传输。 下图所示是广播…

实测可用,ComfyUI工作流:个性二维码设计

前言 ComfyUI工作流&#xff1a;个性二维码设计 朋友们&#xff0c;还在花钱去找别人设计二维码吗&#xff1f; 其实只需要一个comfyui工作流就能解决了。 你是否想过&#xff0c;通过简单的文本描述就能生成惊艳的视觉效果&#xff1f;又或者&#xff0c;你是否想过将二维码…

[数据集][目标检测]道路积水检测数据集VOC+YOLO格式2699张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2699 标注数量(xml文件个数)&#xff1a;2699 标注数量(txt文件个数)&#xff1a;2699 标注…

Leetcode Java学习记录——动态规划基础

概念 首先想到递归、分治。动态规划本质也一样。 共性&#xff1a;找到重复子问题 差异性&#xff1a;有最优子结构&#xff0c;中途可以淘汰次优解。 动态规划是分治最优子结构。 例题 斐波那契数列 递归实现&#xff0c;时间复杂度是指数级。 最基础的写法为 int fib(i…

LCP 633 平方数之和 [leetcode - 8]

最近是在研究双指针啊&#xff0c;leetcode刷的题都是这方面的。都记录在最近的文章里&#xff0c;大家有兴趣可以去我主页看看 LCP633 平方数之和 给定一个非负整数 c &#xff0c;你要判断是否存在两个整数 a 和 b&#xff0c;使得 a2 b2 c 。 示例 1&#xff1a; 输入&…

工业相机错峰启动优化方案

为了解决9台工业相机的错峰启动问题&#xff0c;可以通过LabVIEW程序来实现相机启动的优化。这样可以减少USB带宽的瞬间占用&#xff0c;并避免多个相机同时启动导致的资源冲突。下面是实现错峰启动的思路&#xff1a; 1. 分析启动顺序: 分组管理: 将9台相机分为多个组&#xf…

【Datawhale X 魔搭 】AI夏令营第四期大模型方向,Task4:源大模型微调实战(持续更新)

1.1 大模型微调技术简介 模型微调也被称为指令微调&#xff08;Instruction Tuning&#xff09;或者有监督微调&#xff08;Supervised Fine-tuning, SFT&#xff09;&#xff0c;该方法利用成对的任务输入与预期输出数据&#xff0c;训练模型学会以问答的形式解答问题&#xf…

exocad椅旁设计工作流程是指的什么,椅旁设计工作流程对初学者有什么帮助

随着牙科智能技术的不断进步&#xff0c;exocad软件的椅旁设计工作内容越来越受到重视。此项工作不仅代表了牙科数字化的新发展趋向&#xff0c;也为牙科专业人员&#xff0c;尤其是新手提供了方便高效的工作方法。本文将详细分析exocad椅旁设计工作流程是指的什么&#xff0c;…

神经网络算法 - 一文搞懂Transformer

本文将从Transformer的本质、Transformer的原理、Transformer架构改进三个方面&#xff0c;带您一文搞懂Transformer。 Transformer架构&#xff1a;主要由输入部分&#xff08;输入输出嵌入与位置编码&#xff09;、多层编码器、多层解码器以及输出部分&#xff08;输出线性层…

神经网络算法--文搞懂LSTM(长短期记忆网络)

本文将从LSTM的本质、LSTM的原理、LSTM的应用 三个方面&#xff0c;带您一文搞懂长短期记忆网络Long Short Term Memory | LSTM。 RNN 面临问题&#xff1a;RNN&#xff08;递归神经网络&#xff09;在处理长序列时面临的主要问题&#xff1a;短时记忆和梯度消失/梯度爆炸。 梯…