【代码随想录Day23】回溯算法Part02

39. 组合总和

题目链接/文章讲解:代码随想录
视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_bilibili

class Solution {
    // 存储最终结果的列表
    List<List<Integer>> result = new ArrayList<>();
    // 存储当前路径的链表
    LinkedList<Integer> path = new LinkedList<>();
    // 当前路径的和
    int sum = 0;

    // 主函数,用于调用回溯函数并返回结果
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        // 对候选数组进行排序,以便后续处理
        Arrays.sort(candidates);
        // 调用回溯函数,从第一个元素开始
        backtracing(candidates, target, 0);
        // 返回最终结果
        return result;
    }

    // 回溯函数,用于递归地寻找组合
    public void backtracing(int[] candidates, int target, int startIndex) {
        // 如果当前路径的和大于目标值,直接返回
        if (sum > target) {
            return;
        }
        // 如果当前路径的和等于目标值,将当前路径添加到结果中
        if (sum == target) {
            result.add(new ArrayList<>(path));
            return;
        }
        // 从startIndex开始遍历候选数组
        for (int i = startIndex; i < candidates.length; i++) {
            // 将当前候选值添加到路径和sum中
            sum += candidates[i];
            // 将当前候选值添加到路径中
            path.add(candidates[i]);
            // 递归调用回溯函数,继续寻找组合
            backtracing(candidates, target, i);
            // 递归返回后,从sum中减去当前候选值
            sum -= candidates[i];
            // 从路径中移除最后一个元素
            path.removeLast();
        }
    }
}

40.组合总和II

题目链接/文章讲解:代码随想录
视频讲解:回溯算法中的去重,树层去重树枝去重,你弄清楚了没?| LeetCode:40.组合总和II_哔哩哔哩_bilibili

class Solution {
    // 存储最终结果的列表
    List<List<Integer>> result = new ArrayList<>();
    // 存储当前路径的链表
    LinkedList<Integer> path = new LinkedList<>();
    // 当前路径的和
    int sum = 0;

    // 主函数,用于调用回溯函数并返回结果
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        // 对候选数组进行排序,以便后续处理
        Arrays.sort(candidates);
        // 调用回溯函数,从第一个元素开始
        backtracing(candidates, target, 0);
        // 返回最终结果
        return result;
    }

    // 回溯函数,用于递归地寻找组合
    public void backtracing(int[] candidates, int target, int startIndex) {
        // 如果当前路径的和大于目标值,直接返回
        if (sum > target) {
            return;
        }
        // 如果当前路径的和等于目标值,将当前路径添加到结果中
        if (sum == target) {
            result.add(new ArrayList<>(path));
            return;
        }
        // 从startIndex开始遍历候选数组
        for (int i = startIndex; i < candidates.length; i++) {
            // 剪枝操作:如果当前候选值与前一个候选值相同,并且前一个候选值还没有被使用过,跳过当前候选值
            if (i > startIndex && candidates[i] == candidates[i - 1]) {
                continue;
            }
            // 将当前候选值添加到路径和sum中
            sum += candidates[i];
            // 将当前候选值添加到路径中
            path.add(candidates[i]);
            // 递归调用回溯函数,从下一个元素开始(避免重复使用同一个数字)
            backtracing(candidates, target, i + 1);
            // 递归返回后,从sum中减去当前候选值
            sum -= candidates[i];
            // 从路径中移除最后一个元素
            path.removeLast();
        }
    }
}

在解决组合问题时,如 combinationSum2 这类题目,输入的 candidates 数组可能会包含重复的数字。当题目要求返回的组合是唯一的(即不能包含重复的组合),我们需要采取一定的措施来避免生成重复的结果。

当对 candidates 数组进行排序后,相同的数字会相邻排列。这样,在遍历过程中,如果当前考虑的数字与前一个数字相同,并且前一个数字已经在这个位置被考虑过(即在当前路径中已经被选择过),那么就没有必要再考虑当前这个相同的数字了,因为这样做会导致重复的解。

具体来说,剪枝操作 if (i > startIndex && candidates[i] == candidates[i - 1]) 的目的是跳过所有与前一个已检查过的元素相同的元素。这里的关键是 i > startIndex 这个条件,它确保了只有在当前索引 i 不是 startIndex 的时候才进行跳过操作。这是因为在第一次进入循环的时候,我们希望检查 startIndex 位置的所有可能,包括那些重复的数字。但是在那之后,为了避免重复,我们需要跳过所有与 startIndex 位置上数字相同的后续数字。

通过这种方式,我们保证了每种情况下的唯一性,同时减少了不必要的计算,提高了算法效率。

131.分割回文串

题目链接/文章讲解:代码随想录
视频讲解:代码随想录

class Solution {
    // 存储所有有效的回文分割组合
    List<List<String>> result = new ArrayList<>();
    // 存储当前的回文分割路径
    LinkedList<String> path = new LinkedList<>();

    // 主方法,接收字符串 s 并开始回溯
    public List<List<String>> partition(String s) {
        backtracing(s, 0); // 从索引 0 开始进行回溯
        return result; // 返回所有有效的分割组合
    }

    // 回溯方法,负责生成回文分割
    public void backtracing(String s, int startIndex) {
        // 如果开始索引超过字符串的长度,说明已生成一个有效组合
        if (startIndex >= s.length()) {
            result.add(new ArrayList<>(path)); // 将当前路径的副本添加到结果中
            return; // 返回以结束当前递归
        }

        // 遍历从 startIndex 到字符串的每个可能结束索引 i
        for (int i = startIndex; i < s.length(); i++) {
            // 获取子串
            String substring = s.substring(startIndex, i + 1);
            // 检查该子串是否为回文
            if (check(substring)) {
                path.add(substring); // 如果是回文,将其加入当前路径
                backtracing(s, i + 1); // 递归调用,处理下一个子串的起始索引
                path.removeLast(); // 回溯,移除最后一个添加的子串,恢复路径
            }
        }
    }

    // 检查一个字符串是否为回文
    public boolean check(String s) {
        // 对称比较字符串的字符
        for (int i = 0; i < s.length() / 2; i++) {
            // 如果发现不相等的字符,返回 false
            if (s.charAt(i) != s.charAt(s.length() - 1 - i)) {
                return false;
            }
        }
        // 如果全部字符相同,返回 true,表示是回文
        return true;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI+教育|拥抱AI智能科技,让课堂更生动高效

AI在教育领域的应用正逐渐成为现实&#xff0c;提供互动性强的学习体验&#xff0c;正在改变传统教育模式。AI不仅改变了传统的教学模式&#xff0c;还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务&#xff0c;AI正在全方位提升教育质量和效率。随着…

【OJ刷题】双指针问题6

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…

技术周总结 09.09~09.15周日(C# WinForm WPF 软件架构)

文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中&#xff0c;WPF和WinForm的区别和联系&#xff1f;联系&#xff1a;区别&#xff1a; 二、09.12 周四2.1&#xff09;问题01&#xff1a;visual studio的相关快捷键有哪些&#xff1f;通用快捷键编辑导航调试窗口管理 2…

Python Selenium 自动化爬虫 + Charles Proxy 抓包

一、场景介绍 我们平常会遇到一些需要根据省、市、区查询信息的网站。 1、省市查询 比如这种&#xff0c;因为全国的省市比较多&#xff0c;手动查询工作量还是不小。 2、接口签名 有时候我们用python直接查询后台接口的话&#xff0c;会发现接口是加签名的。 而签名算法我…

细胞分裂检测系统源码分享

细胞分裂检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

计算机人工智能前沿进展-大语言模型方向-2024-09-20

计算机人工智能前沿进展-大语言模型方向-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Garc’ia, Kailan…

[数据集][目标检测]智慧交通铁轨裂缝检测数据集VOC+YOLO格式4类别

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

独立站技能树/工具箱1.0 总纲篇丨出海笔记

正所谓要把一件事做到90分很难&#xff0c;但做到60分基本上照着SOP做到位都没问题&#xff0c;如果我们能把每件事都做到60分&#xff0c;那绝对比至少60%的人都强&#xff0c;除非你的对手不讲武德——那就是他很可能看了我这篇文章&#xff0c;不但每方面都超过及格线&#…

fiddler抓包06_抓取https请求(chrome)

课程大纲 首次安装Fiddler&#xff0c;抓https请求&#xff0c;除打开抓包功能&#xff08;F12&#xff09;还需要&#xff1a; ① Fiddler开启https抓包 ② Fiddler导出证书&#xff1b; ③ 浏览器导入证书。 否则&#xff0c;无法访问https网站&#xff08;如下图&#xff0…

将sqlite3移植到arm开发板上:

一、下载源代码 sqlite3网址&#xff1a;https://www.sqlite.org/download.html 下载&#xff1a;sqlite-autoconf-3460100.tar.gz 二、解压 在Linux家目录下创建一个sqlite3文件夹&#xff0c;将压缩包复制到该文件夹下&#xff0c;再在该目录下打开一个终端&#xff0c;执行…

【Linux】简易日志系统

目录 一、概念 二、可变参数 三、日志系统 一、概念 一个正在运行的程序或系统就像一个哑巴&#xff0c;一旦开始运行我们很难知晓其内部的运行状态。 但有时在程序运行过程中&#xff0c;我们想知道其内部不同时刻的运行结果如何&#xff0c;这时一个日志系统可以有效的帮…

【路径规划】 红嘴蓝鹊优化器:一种用于2D/3D无人机路径规划和工程设计问题的新型元启发式算法

摘要 本文提出了一种新型元启发式算法——红嘴蓝鹊优化器&#xff08;RBMO&#xff09;&#xff0c;用于解决2D和3D无人机路径规划以及复杂工程设计问题。RBMO灵感来源于红嘴蓝鹊的群体合作行为&#xff0c;包括搜索、追逐、捕猎和食物储藏。该算法通过模拟这些行为&#xff0…

prober found high clock drift,Linux服务器时间不能自动同步,导致服务器时间漂移解决办法。

文章目录 一、场景二、问题三、解决办法&#xff08;一&#xff09;给服务器添加访问网络能力&#xff08;二&#xff09;手动同步1. 检查有没有安装ntp2. 没有安装ntp则离线安装ntp2.1 下载安装包2.2 安装2.3 启动 ntp 3. 设置内部时钟源3.1 编辑/etc/ntp.conf3.1 重启ntp服务…

低代码平台后端搭建-阶段完结

前言 最近又要开始为跳槽做准备了&#xff0c;发现还是写博客学的效率高点&#xff0c;在总结其他技术栈之前准备先把这个专题小完结一波。在这一篇中我又试着添加了一些实际项目中可能会用到的功能点&#xff0c;用来验证这个平台的扩展性&#xff0c;以及总结一些学过的知识。…

【C++】关键字auto详解

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、类型别名思考 三、auto简介 四…

python 运行其他命令行工具,实时打印输出内容

起因&#xff0c; 目的: python 运行一个命令&#xff0c;最简洁的写法是: import os # 转换视频格式。 cmd "ffmpeg -i a1.ts -c copy a1.mp4"os.system(cmd)问题&#xff1a; 如果上面的视频比较大&#xff0c;需要运行很长时间&#xff0c;那么感觉就像是卡住…

向日葵和这三款远程控制神器,让你轻松掌控一切!

向日葵远程控制&#xff0c;作为科技控们的最佳良伴&#xff0c;一定是我们居家、办公必备的神器啦&#xff01;别看咱们工作、学习有时候烦得心都碎成了二八瓣&#xff0c;但有了向日葵远程控制&#xff0c;咱们的效率绝对能飞起来&#xff01;今天&#xff0c;咱们就一起走进…

C++11 lambda表达式

前言 上几期我们介绍了类的新功能&#xff0c;右值引用、完美转发语法特性&#xff0c;本期继续介绍C11的新语法特性&#xff0c;即lambda表达式&#xff01; 目录 前言 lambda表达式 lambda的引入 什么是lambda 表达式 lambda表达式的语法 捕捉列表说明 lambda的底层…

卡西欧相机SD卡格式化后数据恢复指南

在数字摄影时代&#xff0c;卡西欧相机以其卓越的性能和便携性成为了众多摄影爱好者的首选。然而&#xff0c;随着拍摄量的增加&#xff0c;SD卡中的数据管理变得尤为重要。不幸的是&#xff0c;有时我们可能会因为操作失误或系统故障而将SD卡格式化&#xff0c;导致珍贵的照片…

Linux笔记---简单指令

1. 使用的环境 博主使用的是华为云服务器xshell终端的方式学习的&#xff0c;因为据说这样的方式比较接近以后的工作环境。 其中云服务器安装的是Ubuntu操作系统(以Linux为内核&#xff0c;适合新手学习Linux的一个版本) 这里的云服务器不一定使用华为的&#xff0c;但是我在…