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

39. 组合总和

  • 刷题icon-default.png?t=N7T8https://leetcode.cn/problems/combination-sum/description/
  • 文章讲解icon-default.png?t=N7T8https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html
  • 视频讲解icon-default.png?t=N7T8https://www.bilibili.com/video/BV1KT4y1M7HJ/?vd_source=af4853e80f89e28094a5fe1e220d9062
  • 回溯树图示:

  • 题解:
class Solution {
    //与之前组合总和的问题的区别在于:
        //之前的问题限制了元素个数k,本题中却未限制单个集合中元素个数
        //且因为可以无限被选取,所以排除0,均为正整数
        //这就表明本题回溯树的高度的控制条件只有sum,高度不能确定
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        //存储最终的结果序列
        List<List<Integer>> result = new ArrayList<>();
        //为了进行合适的剪枝,需要对原始序列进行预排序
        Arrays.sort(candidates);
        combinationSum1(result, new ArrayList<>(), candidates, target, 0, 0);
        return result;
    }
    //参数1:传入最终结果列表
    //参数2:传入存储单个结果的列表
    //参数3:传入原始序列
    //参数4:传入目标总和
    //参数5:传入当前总和
    //参数6:传入控制for循环遍历的起始
    public void combinationSum1(List<List<Integer>> result, List<Integer> path, int[] candidates, int target, int sum, int startIndex){
        //递归出口,此时找到了和为target的组合,直接返回
        //由于元素可以无限选取,所以递归结束的情况只有两种:
            //1、总和恰好等于目标值,递归结束
            //2、总和大于目标值,递归结束
        if(sum == target){
            result.add(new ArrayList<>(path));
            return;
        }
        //递归回溯部分
        //横向遍历,回溯树宽度即为原序列长度
        for(int i = startIndex; i < candidates.length; i++){
            //剪枝,若当前sum再加上当前值大于目标值,则直接终止当前的遍历
            //因为原序列都是经过递增排序的,当前值已经大于目标值了,再接着遍历的话会更大于目标值
            //所以需要结束当前遍历,进入下一个上级结点的遍历
            if(sum + candidates[i] > target){
                break;
            }
            //若加上当前值小于目标值,则可将当前值加入path序列
            path.add(candidates[i]);
            //递归部分
            //因为二级递归不需要和一级递归避免重复,因为题目中某个元素可以重复使用不限制使用次数
            //所以二级递归和一级递归一样仍然以i开始
            combinationSum1(result, path, candidates, target, sum + candidates[i], i);
            //回溯部分
            //移除最后一个
            path.remove(path.size() - 1);
        }
    }
}

40.组合总和II

  • 刷题icon-default.png?t=N7T8https://leetcode.cn/problems/combination-sum-ii/description/
  • 文章讲解icon-default.png?t=N7T8https://programmercarl.com/0040.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CII.html
  • 视频讲解icon-default.png?t=N7T8https://www.bilibili.com/video/BV12V4y1V73A/?vd_source=af4853e80f89e28094a5fe1e220d9062
  • 回溯树图示:

  • 题解:
class Solution {
    //标记used数组去重法
    //记录最终结果
    List<List<Integer>> result = new ArrayList<>();
    //记录单趟结果
    LinkedList<Integer> path = new LinkedList<>();
    //标记当前元素当前分支是否使用过
    boolean[] used;
    //记录当前总和
    int sum = 0;
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        //创建和原始序列等长的used标记序列
        used = new boolean[candidates.length];
        //为了将重复元素放在一起进行的排序操作
        Arrays.sort(candidates);
        combinationSum21(candidates, target, 0);
        return result;
    }
    //树枝去重和树层去重
    //树枝可以使用两个值相等的不同元素,树层则不可以(经分析)
    //所以我们需要通过used数组进行树层去重
    public void combinationSum21(int[] candidates, int target, int startIndex){
        //递归出口
        if(sum == target){
            result.add(new ArrayList<>(path));
            return;
        }
        //递归回溯部分
        for(int i = startIndex; i < candidates.length; i++){
            if(sum + candidates[i] > target){
                break;
            }
            //进行树层去重
            //debug点:防止 i-1 < 0 下标越界,需要再加限制条件i > 0
            if(i>=1 && candidates[i] == candidates[i - 1] && !used[i - 1]){
                //继续进行该层后序元素的遍历
                continue;
            }
            used[i] = true;
            sum += candidates[i];
            path.add(candidates[i]);
            //递归部分
            //因为题中要求candidates 中的每个数字在每个组合中只能使用一次,
            //则下次递归startIndex从i+1开始
            combinationSum21(candidates, target, i + 1);
            //回溯部分
            used[i] = false;
            sum -= candidates[i];
            path.removeLast();
        }
        
    }
}

131.分割回文串

  • 刷题icon-default.png?t=N7T8https://leetcode.cn/problems/palindrome-partitioning/description/
  • 文章讲解icon-default.png?t=N7T8https://programmercarl.com/0131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.html
  • 视频讲解icon-default.png?t=N7T8https://www.bilibili.com/video/BV1c54y1e7k6/?vd_source=af4853e80f89e28094a5fe1e220d9062
  • 回溯树图示:

  • 题解:
class Solution {
    //存放整体结果
    List<List<String>> result = new ArrayList<>();
    //存放单趟结果
    Deque<String> deque = new LinkedList<>();
    public List<List<String>> partition(String s) {
        partition1(s, 0);
        return result;
    }
    //关键点在于:
        //1、判断的合理区间在[startIndex, i]左闭右闭区间内
        //2、分割线即为每次递归或者回溯后的startIndex
    public void partition1(String s, int startIndex){
        //递归出口
        if(startIndex >= s.length()){
            result.add(new ArrayList(deque));
            return;
        }
        //递归回溯部分
        for(int i = startIndex; i < s.length(); i++){
            //若是回文子串,则记录结果
            if(isHuiwen(s, startIndex, i)){
                //因为substring左闭右开,而目标区间是左闭右闭,所以右边界加了1
                String str = s.substring(startIndex, i + 1);
                deque.addLast(str);
            }else{
                //若不是回文子串,则继续向后遍历即可
                continue;
            }
            //递归
            //因为需要保证不重复,则起始位置后移
            partition1(s, i + 1);
            //回溯
            deque.removeLast();
        }
    }
    //判断是否为回文子串
    public boolean isHuiwen(String s, int startIndex, int end){
        for(int i = startIndex, j = end; i < j; i++, j--){
            if(s.charAt(i) != s.charAt(j)){
                return false;
            }
        }
        return true;
    }
}

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

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

相关文章

vue+django+python办公耗材网上商城采购库存管理系统

办公耗材采购信息管理是信息行业业务流程过程中十分重要且必备的环节之一&#xff0c;在信息行业业务流程当中起着承上启下的作用&#xff0c;其重要性不言而喻。但是&#xff0c;目前许多信息行业在具体的业务流程处理过程中仍然使用手工操作的方式来实施&#xff0c;不仅费时…

C语言运用中断子系统用驱动控制led实验,c语言串口led点灯实验(驱动+应用层)

中断子系统用驱动控制led实验 驱动代码 #include <linux/init.h> #include <linux/module.h>#include<linux/interrupt.h> #include<linux/gpio.h> #include<linux/timer.h>#include<linux/of.h> #include<linux/of_irq.h> #inclu…

MySQL MGR 恢复(从库维度)

集群信息 一主两从 端口 角色 3307 主 3309 备 3303 备 从库故障 关掉 3303 从库 删除所有数据&#xff0c;模拟故障 从库恢复还原(物理备份恢复) 备份另一台 处于组关中的 从库的数据&#xff0c;端口为 3309 物理备份 xtrabackup --defaults-file/etc/my3309.cnf …

idea在工具栏中显示快速创建包和类的图标

一、效果图 点击需要创建包或者类的位置&#xff0c;在点击对用的图标就可以快速创建类或者包了。 二、设置 步骤一 View-->Appearance-->Toolbar 步骤二 File-->Settings-->Appearance & Behavior-->Menus and Toolbars-->Main Toolbar-->----…

路飞项目--06

redis介绍和安装 # 数据库&#xff1a; 关系型数据库&#xff1a;mysql、oracle、postgrasql、sqlserver、sqlite IBM&#xff1a;服务器 Oracle&#xff1a;数据库 达梦 EMC&#xff1a;存储 非关系型数据库: redis、mongodb、es…

数据库增删改查

DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据库用户、控制数…

高录用快见刊【最快会后两个月左右见刊】第三届社会科学与人文艺术国际学术会议 (SSHA 2024)

第三届社会科学与人文艺术国际学术会议 (SSHA 2024) 2024 3rd International Conference on Social Sciences and Humanities and Arts *文章投稿均可免费参会 *高录用快见刊【最快会后两个月左右见刊】 重要信息 会议官网&#xff1a;icssha.com 大会时间&#xff1a;202…

基于生成扩散模型的分子对接程序-DiffDock安装及使用

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、DiffDock是什么&#xff1f;二、DiffDock安装步骤1. 下载2.创建conda环境并安装STEP 1. 创建conda环境并配置STEP 2. 配置ESM和OpenFoldSTEP 3. 检查cuda和pytorch geometric安装STEP 4. 检查p…

Linux:Jenkins用户权限和管理

1.下载插件 由于Jenkins的默认权限管理并不是很精细所以我们安装一个插件进行权限的一个管理 插件名称为&#xff1a;Role-based Authorization Strategy 安装完插件我们再去配置一下 进入全局安全配置 选择这个Role-Based Strategy策略然后保存 2.创建角色 我们这里主要使…

ArcgisForJS如何在线编辑ArcGIS Server发布的几何要素?

文章目录 0.引言1.ArcGIS创建几何要素2.ArcGIS Server发布几何要素3.ArcgisForJS在线编辑ArcGIS Server发布的几何要素 0.引言 ArcGIS For JS 是一种用于创建和编辑地理信息的 JavaScript 库&#xff0c;它允许用户在线编辑 ArcGIS Server 发布的几何要素。本文从ArcGIS创建几…

小程序--应用生命周期

小程序的应用周期处理逻辑都写在app.js中。 一、onLaunch 小程序启动时&#xff08;初始化完成&#xff09;执行&#xff0c;只执行一次。 常用于小程序更新&#xff0c;获取启动参数&#xff0c;获取场景值。 二、onShow 小程序启动&#xff0c;或从后台切换至前台时执行。 …

代码随想录算法训练营day20||二叉树part07、● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 【需要领悟一下二叉树遍历上双指针操作&#xff0c;优先掌握递归】 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 思路 题目中要求在二叉…

第四十天| 343. 整数拆分、96.不同的二叉搜索树

Leetcode 343. 整数拆分 题目链接&#xff1a;343 整数拆分 题干&#xff1a;给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。 思考&#xff1a;动态规划。…

探索Promise异步模式抽象的变体——Promise.race篇

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 前言初识Promise.race探索Promise.raceAPI实例 前言 在本栏前一篇Promise.all中&#xff0c;我们可以实…

美格智能联合罗德与施瓦茨完成5G RedCap模组SRM813Q验证,推动5G轻量化全面商用

全球5G发展进入下半场&#xff0c;5G RedCap以其低成本、低功耗的特性成为行业焦点。近日&#xff0c;中国移动携手合作伙伴率先完成全球最大规模、最全场景、最全产业的RedCap现网规模试验&#xff0c;推动首批芯片、终端具备商用条件&#xff0c;RedCap端到端产业已全面达到商…

【Vuforia+Unity】AR02-长方体物体识别(Multi Targets)

1.创建模型 选择多维长方体图&#xff0c;这个长方体是生活中的真实物体的拍摄图&#xff0c;提前把6个面拍摄好并裁剪干净。 官网创建模型https://developer.vuforia.com/targetmanager/project/targets?projectId0ddbb5c17e7f4bf090834650bbea4995&avfalse 设置长宽高…

状态模式:灵活应对对象行为变化,实现状态驱动的智能设计

文章目录 **一、技术背景与应用场景****为何使用状态模式&#xff1f;****典型应用场景包括但不限于&#xff1a;** **二、状态模式定义与结构****三、使用步骤举例****四、优缺点分析****总结** 一、技术背景与应用场景 状态模式是一种行为设计模式&#xff0c;用于处理一个对…

分享一个UE的SmoothStep小技巧

SmoothStep节点可以制作更平滑的动画&#xff0c;而如果将max参数作为值传入将value和min参数作为约束&#xff0c;则可以做出类似冲击波的渐变效果&#xff1a; 并且通过修改value与min之间的数值差&#xff0c;可以调节渐变。 这个技巧主要就是可以产生硬边。 比如我们可…

2024年阿里云服务器新购、续费、升级优惠政策和优惠活动大全

2024年阿里云服务器购买、续费、升级优惠政策整理&#xff0c;阿里云服务器优惠价格表&#xff1a;轻量2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;阿里云ECS云服务器2核2G3M新老用户均可99元一年续费不涨价…

信息系统项目管理师(高项)—学习笔记

第一章信息化发展 1.1 信息与信息化 1.1.1 信息 信息是物质、能量及其属性的标示的集合&#xff0c;是确定性的增加。 它以物质介质为载体&#xff0c;在传递和反映世界各种事物存在方式、运动状态等的表征。 信息不是物质&#xff0c;也不是能力&#xff0c;它以一种普遍…