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

news2025/2/24 23:53:06

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;
    }
}

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

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

相关文章

【算法笔记自学】第 6 章 C++标准模板库(STL)介绍

6.1vector常见用法详解 #include <cstdio> #include <vector> using namespace std;int main() {int n, x;scanf("%d", &n);vector<int> v;for (int i 0; i < n; i) {scanf("%d", &x);v.push_back(x);}for (int i 0; i <…

方法引用详解

什么是方法引用&#xff1f;&#xff1a;针对于函数式接口中的抽象方法 为什么用方法引用&#xff1f;&#xff1a;避免代码的重复&#xff0c;简便书写&#xff0c;提高效率 在使用Lambda表达式的时候&#xff0c;我们实际上传递进去的代码就是一种解决方案&#xff1a;拿参数…

第15章 奇异值分解:习题解答及其案例

这一章初学建议看该视频学习&#xff0c;讲得歪瑞古德&#xff1a; 《统计学习方法》李航 第15章奇异值分解 1.矩阵的奇异值分解是指将 m n m \times n mn实矩阵 A A A表示为以下三个实矩阵乘积形式的运算 A U Σ V T A U \Sigma V ^ { T } AUΣVT 其中 U U U是 m m m阶正…

文件读写操作之c语言、c++、windows、MFC、Qt

目录 一、前言 二、c语言文件读写 1.写文件 2.读文件 三、c文件读写 1.写文件 2.读文件 四、windows api文件读写 1.写文件 2.读文件 五、MFC文件读写 1.写文件 2.读文件 六、Qt文件读写 1.写文件 2.读文件 七、总结 一、前言 我们在学习过程中&#xff0c…

图像分类-数据驱动方法

K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09; KNN算法通过比较新样本与训练集中的样本的距离&#xff0c;然后根据最近的K个邻居的投票结果来决定新样本的分类。 如图所示&#xff0c;K越大的边界会更加平滑&#xff0c;本质上是根据某一样本最近…

从0到1:培训老师预约小程序开发笔记二

背景调研 培训老师预约小程序&#xff1a; 教师和学生可以更便捷地安排课程&#xff0c;并提升教学质量和学习效果&#xff0c;使之成为管理和提升教学效果的强大工具。培训老师可以在小程序上设置自己的可预约时间&#xff0c;学员可以根据老师的日程安排选择合适的时间进行预…

对接海康sdk-linux下复制jar包中resource目录的文件夹

背景 在集成海康sdk时,需要将一些组件放到项目中作为静态资源,并且海康的sdk初始化也需要加载这些静态资源,在windows下,使用一些File路径的方式是可以正确加载的,但是在linux上就会加载失败。 首先我是将海康的sdk组件放到resource下的,并且按照windows和linux设置了两…

【硬件产品经理】硬件产品手板设计

目录 简介 硬件手板 手板资料 作者简介 简介 今天来聊聊产品手板这个话题。 到了手板这个层面其实就属于产品设计细节了&#xff0c; 无论你对整个开发体系如何如何了解&#xff0c; 对公司管理流程如何如何精通。 最终都是要回归到业务细节中去的&#xff0c; 你可能…

6800和8080单片机读写时序和液晶屏接口

前言&#xff1a; 随着单片机发展&#xff0c;集成度越来越高&#xff0c;因此目前单片机较少使用RD和WR信号操作外设&#xff0c;因此很多时候&#xff0c;变成了6800和8080单片机读写液晶屏了。早期的读写本质上是对一个地址进行即时的操作&#xff0c;现在可能是等数据送到…

信号与系统-实验6-离散时间系统的 Z 域分析

一、实验目的 1、掌握 z 变换及其性质&#xff1b;了解常用序列的 z 变换、逆 z 变换&#xff1b; 2、掌握利用 MATLAB 的符号运算实现 z 变换&#xff1b; 3、掌握利用 MATLAB 绘制离散系统零、极点图的方法&#xff1b; 4、掌握利用 MATLAB 分析离散系统零、极点的方法&a…

Docker部署Seata与Nacos整合

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Docker部署Seata与Nacos整合 Docker 部署 Seata 与 Nacos 整合 运行所使用的 demo项目地址 …

最近你悟出来什么道理?

点击上方△腾阳 关注 转载请联系授权 大家伙&#xff0c;我是腾阳。 活了近30年的我&#xff0c;终于领悟到&#xff0c;人生的旅途是一场深刻而复杂的自我发现与灵魂成长的壮丽征途。 这不仅仅是对外在世界的探索&#xff0c;更是内心深处的一场革命&#xff0c;是灵魂从懵…

移动应用开发课设——原神小助手文档(1)

2023年末&#xff0c;做的移动应用开发课设&#xff0c;分还算高&#xff0c;项目地址&#xff1a;有帮助的话&#xff0c;点个赞和星呗~ GitHub - blhqwjs/-GenShin_imp: 2023年移动应用开发课设 本文按照毕业论文要求来写&#xff0c;希望对大家有所帮助。 xxxx大学课程设计报…

SpringBoot 生产实践:没有父 starter 的打包问题

文章目录 前言一、搜索引擎二、Chat GPT三、官方文档四、小结推荐阅读 前言 今天刚准备写点文章&#xff0c;需要 SpringBoot 项目来演示效果。一时心血来潮&#xff0c;没有采用传统的方式&#xff08;即通过引入 spring-boot-starter-parent 父工程的方式&#xff09;。 &l…

Django学习第六天

启动项目命令 python manage.py runserver 取消模态框功能 js实现列表数据删除 第二种实现思路 使用jquery修改模态框标题 编辑页面拿到数据库数据显示默认数据功能实现 想要去数据库中获取数据时&#xff1a;对象/字典 三种不同的数据类型 使用Ajax传入数据实现表单编辑&…

ContextCapture - 开启三维世界的魔法之门

亲爱的朋友们&#xff0c;当我第一次接触到ContextCapture这款软件时&#xff0c;我的内心激动得难以平静。仿佛一位魔法师突然出现在我面前&#xff0c;向我展示了一个全新的世界。是的&#xff0c;这就是ContextCapture带给我的感觉 - 它不仅仅是一款软件&#xff0c;更是一把…

电机控制杂谈——增量式的预测电流控制的优势在哪?

1.前言 前几天看到这么个问题。“模型预测控制如何消除静态误差” 评论说用增量式的预测控制。 这个回答让我想起来我大四下看的这篇论文。现在都一百多被引用了。 但是苦于当时能力有限&#xff0c;没办法复现这个文章。 所以现在想重新验证一下。 2.静态误差和电机磁链有…

【大数据】—FIFA世界杯探索性分析(EDA)

引言 足球&#xff0c;作为全球最受欢迎的运动之一&#xff0c;拥有庞大的粉丝群体和深远的文化影响。自1930年首届FIFA世界杯举办以来&#xff0c;这项赛事已经成为全球体育盛事&#xff0c;吸引了数十亿观众的目光。世界杯不仅是各国足球技艺的较量&#xff0c;更是国家荣誉…

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

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

linux watchdog 子系统

目录 一、watchdog 子系统二、关键数据结构2.1 watchdog_device2.2 watchdog_ops2.3 watchdog_info 三、重要流程3.1 watchdog 初始化3.2 watchdog 设备注册3.3 watchdog 设备文件操作函数3.4 watchdog 喂狗用户空间 watchdog&#xff08;busybox&#xff09;内核空间喂狗疑问 …