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

1. LeetCode 39. 组合总和

题目链接:https://leetcode.cn/problems/combination-sum/description/
文章链接:https://programmercarl.com/0039.组合总和.html
视频链接:https://www.bilibili.com/video/BV1KT4y1M7HJ

在这里插入图片描述

思路:
本题和77.组合 (opens new window)、216.组合总和III (opens new window)有两点不同:
1.组合没有数量要求;
2.元素可无限重复选取。
无数量要求,则不能根据列表长度进行终止,需要根据sum>target进行终止;
可重复取,则递归时不用startIndex加一。

解法:
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        if (candidates.length == 0) {
            return res;
        }
        find(candidates,target,0,0);
        return res;
    }

    public void find (int[] candidates,int target,int sum,int startIndex) {
        if (sum == target) {
            res.add(new ArrayList(list));
            return;
        } else if (sum > target) {
            return;
        }

        for (int i=startIndex;i<candidates.length;i++) {
            // 处理当前节点
            list.add(candidates[i]);
            sum += candidates[i];
            // 递归
            find(candidates,target,sum,i);
            // 撤销当前节点
            list.removeLast();
            sum -= candidates[i];
        }
    }
}

2. LeetCode 40.组合总和II

题目链接:https://leetcode.cn/problems/combination-sum-ii/description/
文章链接:https://programmercarl.com/0040.组合总和II.html
视频链接:https://www.bilibili.com/video/BV12V4y1V73A

在这里插入图片描述

思路:
本题同样是求组合总和,但就是因为其数组candidates有重复元素,而要求不能有重复的组合,所以相对于39.组合总和 (opens new window),需要组合去重。

解法:
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        if (candidates == null || candidates.length == 0) {
            return res;
        }
        Arrays.sort(candidates);
        find(candidates,target,0,0);
        return res;
    }

    public void find(int[] candidates,int target,int sum,int startIndex) {
        if (sum > target) {
            return;
        }
        if (sum == target) {
            res.add(new ArrayList(list));
            return;
        }
        for (int i=startIndex;i<candidates.length;i++) {
            // 当前层去重
            if (i>startIndex) {
                if (candidates[i] == candidates[i-1]) {
                    continue;
                }
            }
            // 处理当前节点
            list.add(candidates[i]);
            sum+=candidates[i];
            // 递归
            find(candidates,target,sum,i+1);
            // 撤销当前节点 回溯
            list.removeLast();
            sum-=candidates[i];
        }
    }
}

3. LeetCode 131.分割回文串

题目链接:https://leetcode.cn/problems/palindrome-partitioning/description/
文章链接:https://programmercarl.com/0131.分割回文串.html
视频链接:https://www.bilibili.com/video/BV1c54y1e7k6

在这里插入图片描述

思路:
与组合类似,不过组合是每层选出一个数值,而分割是每层选出多个相邻数值组成的字段。
注意:当前层的分割线是下一层的起点。

解法:
class Solution {
    List<List<String>> res = new ArrayList<>();
    List<String> list = new ArrayList<>();
    public List<List<String>> partition(String s) {
        if (s == null || s.length() == 0) {
            return res;
        }
        find(s,0);
        return res;
    }

    public void find(String s,int startIndex) {
       // 终止条件
       if (startIndex == s.length()) {
          res.add(new ArrayList(list));
          return;
       }

       // 遍历单层
       for (int i=startIndex;i<s.length();i++) {
        // 判断是否是回文串
          if (isPalindrome(s.substring(startIndex,i+1))){// i+1是分割线
            String subStr = s.substring(startIndex,i+1);
            // 处理当前节点
            list.add(subStr);
            // 递归
            find(s,i+1);
            // 撤销当前节点
            list.removeLast();
          } else {
            continue;
          }
       }
    }

    /**
    判断是否是回文串
     */
    public boolean isPalindrome(String sub) {
        for (int i=0,j=sub.length()-1;i<j;i++,j--) {
            if (sub.charAt(i) != sub.charAt(j)) {
                return false;
            }
        }
        return true;
    }
}

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

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

相关文章

Java多语言跨境电商外贸商城源码 tiktok商城系统源码 跨境电商源码

Java多语言跨境电商外贸商城源码 tiktok商城系统源码 跨境电商源码 技术栈 PC端使用&#xff1a;vueelementui 用户端使用&#xff1a;uniapp 管理端使用&#xff1a;vueelementui 后台服务使用&#xff1a;springbootmybatisplusmysql 功能描述&#xff1a; 对接PayPal…

统计是一门艺术(非参数假设检验)

1.定义 当总体分布未知&#xff0c;那么就需要一种与分布具体数学形式无关的统计推断方法&#xff0c;称为非参数方法 只能利用样本中的一般信息包括位置和次序关系等 稳健性强 2.符号检验 考虑问题&#xff1a; 小样本情况&#xff1a; 以概率为1/2的二项分布是对称的 两…

idea部署war包成功,但是接口404

场景 项目结构 xxx-xxx-app xxx-xxx-service xxx-xxx-webappapp/webapp依赖service&#xff0c;service中写了各种api&#xff0c;先别管它合不合理&#xff0c;正式环境用webapp发布。 本地配置tomcat启动&#xff0c;但是发现每次部署成功&#xff0c;但是service中的接口…

使用Ubuntu 22.04安装Frappe-Bench【二】

系列文章目录 第一章 使用VMware创建Ubuntu 22.04【一】 文章目录 系列文章目录前言什么是Frappe-Bench&#xff1f;使用安装ERPNext能实现什么效果&#xff1f; 官网给了一个说明 一、使用Ubuntu 22.04安装Frappe-Bench一、安装要求二、安装命令三、 可能出现问题 总结 前言 …

hnust 1816: 算法10-9:简单选择排序

hnust 1816: 算法10-9&#xff1a;简单选择排序 题目描述 选择排序的基本思想是&#xff1a;每一趟比较过程中&#xff0c;在n-i1(i1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。 在多种选择排序中&#xff0c;最常用且形式最为简单的是简单选择排序。…

JavaScript中的立即执行函数表达式(Immediately Invoked Function Expression, IIFE)

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介JavaScript中的立即执行函数表达式&#xff08;Immediately Invoked Function Expression, IIFE&#xff09;1. 引言2. IIFE的概念2.1 概述2.2 语法2.3 历史背景 3. IIFE的作用3.1 创建独立作用域3.2 模块化代码3.3 防止变量提升3.…

动态路由--RIP配置(思科cisco)

一、简介 RIP协议&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的动态路由选择协议。 在RIP协议中&#xff0c;如果路由器A和网络B直接相连&#xff0c;那么路由器A到网络B的距离被定义为1跳。若从路由器A出发到达网络B需要…

Apache Seata分布式事务启用Nacos做配置中心

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Seata分布式事务启用Nacos做配置中心 Seata分布式事务启用Nacos做配置中心 项目地址 本文作…

FreeU: Free Lunch in Diffusion U-Net——【代码复现】

这篇文章发表于CVPR 2024&#xff0c;官网地址&#xff1a;ChenyangSi/FreeU: FreeU: Free Lunch in Diffusion U-Net (CVPR2024 Oral) (github.com) 一、环境准备 提前准备好python、pytorch环境 二、下载项目依赖 demo下有一个requirements.txt文件&#xff0c; pip inst…

Fill - UVA 10603

网址如下&#xff1a; Fill - UVA 10603 - Virtual Judge (vjudge.net) 感觉有点浮躁&#xff0c;没法完全将思绪投入题的思考中 脑袋糊糊的 一道bfs题 代码如下&#xff1a; #include<queue> #include<cstdio> #include<cstring> #include<vector&g…

开放式耳机哪个牌子好?悠律、漫步者、韶音全面对比与推荐

对于现在的无线耳机市场而言&#xff0c;开放式耳机迎来的真正的大爆发&#xff0c;关键的是它采用了定向传声方式&#xff0c;我们在运动时除了可以感受到音乐带来的快乐外&#xff0c;还能时刻保持对外界环境音的警觉。 今天&#xff0c;我们将为大家详细对比推荐三款备受瞩…

Redis中list类型操作命令(操作演示、命令语法、返回值、时间复杂度、注意事项等)

文章目录 lpush 命令lrange 命令lpushx 命令rpush 命令rpushx 命令lpop 命令rpop 命令lindex 命令linsert 命令llen 命令lrem 命令ltrim 命令lset 命令blpop 和 brpop lpush 命令 从左侧向列表中插入指定的元素 语法&#xff1a;lpush key value [value……] 时间复杂度&#…

大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(2)】

本文将持续更新~~ hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命C…

第三方商城对接重构(HF202407)

文章目录 项目背景一、模块范围二、问题方案1. 商品模块整体来说这块对接的不是太顺利,梳理了几条大概的思路:2. 订单模块3. 售后4. 发票5. 结算单经验总结项目背景 作为供应商入围第三方商城成功,然后运营了一段时间,第三方通知要重构, 需要重新对接打通接口完成系统对接…

【网络管理工具】NETworkManager工具的基本使用教程

【网络管理工具】NETworkManager工具的基本使用教程 一、NETworkManager工具介绍1.1 NETworkManager简介1.2 NETworkManager特点1.3 NETworkManager使用场景 二、下载NETworkManager软件包2.1 下载地址2.2 下载软件 三、运行NETworkManager工具3.1 解压NETworkManager3.2 运行N…

WPF中Background=“{x:Null}“ 和 Transparent

WPF中关于背景透明和背景无 此时&#xff0c;我代码中是写的有有个控件&#xff0c;一个Border &#xff0c;一个TextBox &#xff0c;范围都是全屏这么大&#xff0c;可以输入TextBox 因为&#xff0c;当border没有设置背景的时候&#xff0c;实际上是&#xff1a; <Borde…

实现原理:远程过程调用(RPC)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

Linux多进程和多线程(七)进程间通信-信号量

进程间通信之信号量 资源竞争 多个进程竞争同一资源时&#xff0c;会发生资源竞争。 资源竞争会导致进程的执行出现不可预测的结果。 临界资源 不允许同时有多个进程访问的资源, 包括硬件资源 (CPU、内存、存储器以及其他外 围设备) 与软件资源(共享代码段、共享数据结构) …

2024上半年网络工程师考试《应用技术》试题二

试题二(20分) 阅读以下说明,回答问题,将解答填入对应的解答栏内。 某单位网络拓扑如下图所示.SW1、SW2为核心层交换机&#xff0c;PC网关配置在核心层&#xff0c;SW3-SW4为接入层交换机,行政部PC划为vlan10,销售部PC划为vlan20。 【问题1】(4分) 要求实现骨干链路冗余&…

[leetcode hot 150]第一百三十题,被围绕的区域

题目&#xff1a; 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O 组成&#xff0c;捕获 所有 被围绕的区域&#xff1a; 连接&#xff1a;一个单元格与水平或垂直方向上相邻的单元格连接。区域&#xff1a;连接所有 0 的单元格来形成一个区域。围绕&#xff1a…