代码随想录算法训练营第二十六天|39. 组合总和、 40.组合总和II、 131.分割回文串

news2024/11/23 23:55:07

39. 组合总和

在这里插入图片描述

题目链接:39. 组合总和
文档讲解:代码随想录
状态:卡了一会儿

思路:先排序,方便剪枝。允许数字重复使用,因此递归调用时传入当前索引i。

题解:

public class Solution {
    // 用于存储所有可能的组合
    private List<List<Integer>> res = new ArrayList<>();
    // 当前正在构建的组合
    private LinkedList<Integer> list = new LinkedList<>();
    // 用于存储当前组合的和
    private int sum = 0;

    /**
     * 组合求和函数
     * @param candidates 候选数字数组
     * @param target 目标数字
     * @return 所有可能的组合列表
     */
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        // 首先对候选数字进行排序
        Arrays.sort(candidates);
        // 调用回溯函数
        backtracking(candidates, target, 0);
        // 返回所有可能的组合
        return res;
    }

    /**
     * 回溯函数,用于递归地搜索所有可能的组合
     * @param candidates 候选数字数组
     * @param target 目标数字
     * @param startIndex 当前搜索的起始索引
     */
    public void backtracking(int[] candidates, int target, int startIndex) {
        // 如果当前和大于目标,则回溯
        if (sum > target) {
            return;
        }
        // 如果当前和等于目标,将当前组合添加到结果列表中
        if (sum == target) {
            res.add(new ArrayList<>(list));
            return;
        }
        // 遍历候选数字,从startIndex开始,直到sum+当前数字大于目标或遍历完所有数字
        for (int i = startIndex; i < candidates.length && sum + candidates[i] <= target; i++) {
            // 将当前数字添加到当前组合中,并更新当前和
            sum += candidates[i];
            list.add(candidates[i]);
            // 递归调用回溯函数,搜索当前数字之后的组合
            backtracking(candidates, target, i); // 注意这里传入i,允许重复使用同一个数字
            // 回溯,移除当前数字,恢复当前和
            sum -= candidates[i];
            list.removeLast();
        }
    }
}

40.组合总和II

在这里插入图片描述

题目链接:40.组合总和II
文档讲解:代码随想录
状态:自己在去重的时候,将集合中的重复元素也去掉了,导致结果缺少。集合(数组candidates)有重复元素,但还不能有重复的组合,这个不会处理。

思路:使用used数组标记树层或树枝中的元素是否使用,从而将集合有重复元素和结果又重复组合区分开。
默认used数组都为false,树层有重复元素和树枝有重复元素的关键区别在于used[i-1]是否为true,树层中元素因为回溯会使used[i-1]恢复成false,树枝中有重复元素则used[i-1]使用过,因此为true。在这里插入图片描述

题解:

    List<List<Integer>> res = new ArrayList<>();  // 结果集
    LinkedList<Integer> list = new LinkedList<>();  // 当前组合
    int sum = 0;  // 当前组合的和

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);  // 排序,方便后续处理
        boolean[] used = new boolean[candidates.length];  // 记录每个元素是否被使用过
        Arrays.fill(used, false);  // 初始化为未使用
        backtracking(candidates, used, target, 0);  // 开始回溯
        return res;  // 返回结果集
    }

    public void backtracking(int[] candidates, boolean[] used, int target, int startIndex) {
        if (sum == target) {  // 当前组合的和等于目标值
            res.add(new ArrayList<>(list));  // 将当前组合加入结果集
            return;
        }
        for (int i = startIndex; i < candidates.length && sum + candidates[i] <= target; i++) {
            if (i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1]) {  // 去重
                continue;
            }
            sum += candidates[i];  // 做出选择,更新当前组合的和
            list.add(candidates[i]);  // 将当前元素加入当前组合
            used[i] = true;  // 标记当前元素已被使用
            backtracking(candidates, used, target, i + 1);  // 递归,处理下一个元素
            list.removeLast();  // 撤销选择,回溯到上一个状态
            used[i] = false;  // 标记当前元素未被使用
            sum -= candidates[i];  // 更新当前组合的和
        }
    }

131.分割回文串

在这里插入图片描述

题目链接:131.分割回文串
文档讲解:代码随想录
状态:不会,想到分割方法,代码没写出来!

代码没写出来的原因:

  1. 写成了 if (startIndex == chars.length) { res.add(new ArrayList<>(list)); return; }认为 startIndex == chars.length - 1 时将list添加到res中。实际上因为backtracking(chars, i + 1);的存在,res中添加list的操作都是在下次递归中完成的,而这时i+1就导致startIndex每次都比原来的大了1。
  2. 写成了new String(chars, startIndex, i),而实际上第三个参数是长度
    // 存储所有分割方案的列表
    List<List<String>> res = new ArrayList<>();
    // 当前正在构建的分割方案
    LinkedList<String> list = new LinkedList<>();

    /**
     * 将字符串分割成回文子串的方案
     * @param s 输入的字符串
     * @return 分割方案的列表
     */
    public List<List<String>> partition(String s) {
        // 将字符串转换为字符数组
        char[] chars = s.toCharArray();
        // 从索引0开始回溯
        backtracking(chars, 0);
        // 返回所有分割方案
        return res;
    }

    /**
     * 回溯函数,用于递归地搜索所有可能的回文子串分割方案
     * @param chars 字符串转换后的字符数组
     * @param startIndex 当前搜索的起始索引
     */
    public void backtracking(char[] chars, int startIndex) {
        // 如果当前索引等于字符数组的长度,说明已经处理完所有字符,将当前方案添加到结果中
        if (startIndex == chars.length) {
            res.add(new ArrayList<>(list));
            return;
        }
        // 从当前索引开始,尝试所有可能的分割点
        for (int i = startIndex; i < chars.length; i++) {
            // 如果从startIndex到i的子串是回文串,则将其添加到当前方案中
            if (isPalindrome(chars, startIndex, i)) {
                // 添加子串到当前方案
                list.add(new String(chars, startIndex, i - startIndex + 1));
                // 递归调用回溯函数,继续搜索i之后的分割方案
                backtracking(chars, i + 1);
                // 回溯,移除最后一个添加的子串,以便尝试其他分割方案
                list.removeLast();
            }
        }
    }

    /**
     * 判断子串是否为回文串
     * @param chars 字符数组
     * @param start 子串的起始索引
     * @param end 子串的结束索引
     * @return 如果子串是回文串返回true,否则返回false
     */
    public boolean isPalindrome(char[] chars, int start, int end) {
        // 从子串的两端向中间遍历,如果字符不相等则不是回文串
        while (start <= end) {
            if (chars[start] != chars[end]) {
                return false;
            }
            start++;
            end--;
        }
        // 如果遍历完所有字符都相等,则子串是回文串
        return true;
    }

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

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

相关文章

ETAS AUTOSAR工具链的作用

一、AUTOSAR是什么&#xff1f; AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;是一个全球性的联盟&#xff0c;致力于制定和推广汽车电子系统的标准化解决方案。它是由汽车制造商、供应商和工程公司组成的合作伙伴网络&#xff0c;旨在解决汽车电子系统…

如何理解 Java 类加载器的工作原理及其使用场景

1. 简介 Java类加载器&#xff08;ClassLoader&#xff09;是Java运行时环境的一部分&#xff0c;负责动态加载Java类文件到Java虚拟机&#xff08;JVM&#xff09;中。类加载器是Java反射机制和动态特性的重要基础&#xff0c;为Java的跨平台和动态加载提供了支持。理解类加载…

ANSYS EMC解决方案与经典案例

EMC问题非常复杂&#xff0c;各行各业都会涉及&#xff0c;例如航空、航天、船舶、汽车、火车、高科技、物联网、消费电子。要考虑EMC的对象很多&#xff0c;包含整个系统、设备、PCB、线缆、电源、芯片封装。而且技术领域覆盖广&#xff0c;涉及高频问题、低频问题&#xff1b…

《山西教育》教学版是什么级别的刊物?

《山西教育》教学版是什么级别的刊物&#xff1f; 《山西教育(教学版)》创刊于1956年&#xff0c;是由山西教育报刊社主办的教学刊物。山西省一级期刊&#xff0c;是“宣传教育政策&#xff0c;关注教育热点&#xff0c;传播先进经验&#xff0c;提供教改资讯”的权威性期刊&a…

Http协议JSON格式

1. 计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 思考:计算机网络…

UniVue更新日志:使用Carousel组件实现轮播图效果

github仓库 稳定版本仓库&#xff1a;https://github.com/Avalon712/UniVue 开发版本仓库&#xff1a;https://github.com/Avalon712/UniVue-Develop UniVue扩展框架-UniVue源生成器仓库&#xff1a;https://github.com/Avalon712/UniVue-SourceGenerator 更新说明 今天的更…

数字人源码部署怎么做?如何高效搭建好用的数字人系统?

作为人工智能时代的风口项目&#xff0c;AI数字人自出现之日起便引发了大量的关注。不少创业者都有了搭建数字人系统的想法&#xff0c;但却苦于没有强大的专业背景和雄厚资金支撑&#xff0c;只能在局外徘徊&#xff0c;而这恰恰为数字人源码公司推出的数字人源码部署服务的火…

自然语言处理学习路线(1)——NLP的基本流程

NLP基本流程 【NLP基本流程】 0. 获取语料 1. 语料预处理 2. 特征工程&选择 3. 模型训练 4. 模型输出&上线 【NLP基本流程图】 Reference 1. 自然语言处理(NLP)的一般处理流程&#xff01;-腾讯云开发者社区-腾讯云 2. https://zhuanlan.zhihu.com/p/55…

FreeBSD通过CBSD管理低资源容器jail来安装Ubuntu子系统实践

简介 FreeBSD、CBSD、Jail和Ubuntu&#xff0c;四者的组合方案可以说是强强联合&#xff0c;极具性价比和竞争力&#xff01;同时安装简单方便&#xff0c;整体方案非常先进。 CBSD是为FreeBSD jail子系统、bhyve、QEMU/NVMM和Xen编写的管理层。该项目定位为一个综合解决方案…

YOLOv5目标检测——基于YOLOv5的吊车安全监测

移动式起重机是建筑施工中使用的重要设备。 遵守正确的操作程序对于防止事故很重要。 然而&#xff0c;其中存在人为错误的因素。 这里我将举一个例子来说明计算机视觉&#xff08;CV&#xff09;如何帮助解决这个问题。 1、移动式起重机操作的安全问题 为简单起见&#xff0…

室内外一体化定位系统的创新与应用

随着科技的飞速发展&#xff0c;人们对定位技术的需求日益增强。传统的定位技术主要依赖于室外环境&#xff0c;如GPS等卫星定位技术。然而&#xff0c;在室内环境下&#xff0c;由于信号遮挡和多径效应等问题&#xff0c;这些技术往往难以发挥有效作用。因此&#xff0c;室内外…

记录一次基于Vite搭建Vue3项目的过程

Vue2已经于2023年12月31日停止维护了&#xff0c;2024年算是vue3的崭新的一年&#xff0c;我们的项目也基本从vue2逐渐向着Vue3过渡&#xff0c;Vue3相较于vue2有更好的开发体验&#xff0c;和ts的自然融合使得项目的结构、功能拆分变得更加的清晰&#xff1b;组合式声明有种MV…

【吉林大学Java程序设计】第7章:对象的容纳

第7章&#xff1a;对象的容纳 1.数组 Arrays1.1 数组的创建、初始化和使用&#xff08;1&#xff09;数组的声明&#xff08;2&#xff09;数组初始化静态初始化动态初始化对象数组的初始化 &#xff08;3&#xff09;数组的使用 1.2 多维数组1.3 数组与数组的引用1.4 数组工具…

Python学习从0开始——Kaggle深度学习002

Python学习从0开始——Kaggle深度学习002 一、单个神经元1.深度学习2.线性单元示例 - 线性单元作为模型多个输入 3.Keras中的线性单元 二、深度神经网络1.层多种类型的层 2.激活函数3.堆叠密集层4.构建Sequential模型 三、随机梯度下降1.介绍2.损失函数3.梯度下降法1.梯度下降法…

Spring Boot 优雅关机时异步线程安全优化

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

【Python】在运行中使用warnings.filterwarnings,可以忽略测试中遇到的问题

在 Python 中&#xff0c;warnings 是一个内置模块&#xff0c;用于发出有关程序执行的警告信息&#xff0c;这些警告信息通常是关于程序行为的潜在问题。 不过&#xff0c;这些问题通常不是致命的错误&#xff0c;只不过是展示我们代码中潜在的问题&#xff0c;或不推荐的做法…

红酒:家庭环境中如何创造理想的红酒储存环境

对于热爱品鉴红酒的人来说&#xff0c;如何在家庭环境中创造一个理想的红酒储存环境是至关重要的。理想的储存环境能够确保红酒的品质和口感长时间保持理想状态。下面云仓酒庄雷盛红酒将介绍一些在家庭环境中创造理想红酒储存环境的建议&#xff1a; 温度控制&#xff1a;红酒的…

2024年ERP软件公司排名前十!

在当今的商业环境中&#xff0c;ERP&#xff08;企业资源规划&#xff09;系统已成为企业日常运营不可或缺的一部分。然而&#xff0c;如何在这众多的ERP系统软件中筛选出最适合自己的一款&#xff0c;成为许多企业共同面临的挑战。今天&#xff0c;我将带大家盘点erp软件公司的…

生成式AI新篇章:亚马逊云科技助力重塑数字未来

编辑&#xff1a;阿冒 设计&#xff1a;沐由 “任何非常先进的技术&#xff0c;初看都与魔法无异。”对于这句话&#xff0c;想必科幻迷们应该不会感到陌生。这则广为人知的定律&#xff0c;是著名科幻小说作家亚瑟克拉克在《2001太空漫游》中提出的。 正因为如此&#xff0c;当…

知识图谱存在的挑战---隐私、安全和伦理相关和测试认证相关

文章目录 隐私、安全和伦理相关测试认证相关 隐私、安全和伦理相关 从部署拓扑结构而言&#xff0c;知识图谱技术以数据为核心、数据库为载体的方式来存储&#xff0c;有单机、云平台、集群及其组合的部署方式&#xff0c;结合大数据平台、云平台、业务系统、灾备、网络系统及其…