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

news2025/1/10 3:16:14

39. 组合总和

看完题后的思路

在这里插入图片描述

  1. 本题本质上还是一个传统排列题,不同之处在于每个元素可以重复选取。
  2. void f(【】,startIndex,sum)
  3. 递归终止
    if(和==target){
    加入;
    返回;
    }
  4. 递归
    for(){
    剪枝;
    加入;
    f(xxx,startIndex);// 不变
    回溯;
    // 本层下一个

}
4. 剪枝
使用continue;

代码

class Solution {
        List<List<Integer>> ires = new ArrayList<>();
    ArrayList<Integer> ipath = new ArrayList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        combinationSumBT(candidates,target,0,0);
        return ires;
    }
    public void combinationSumBT(int[] candidates, int target,int sum,int startIndex) {
        // 出口
        if (sum==target){
            ires.add(new ArrayList<>(ipath));
            return;
        }
        
        // 引擎
        for (; startIndex < candidates.length; startIndex++) {
            // 剪枝
            if (candidates[startIndex]+sum>target){
                    continue;
            }
            ipath.add(candidates[startIndex]);
            combinationSumBT(candidates,target,sum+candidates[startIndex],startIndex);
            ipath.remove(ipath.size()-1);
            // 下一次
        }
       
    }
}

复杂度

最坏 0(元素个数^target),最深target层
在这里插入图片描述

收获

1. 三刷大脑过一遍
2. 本题是组合取重复元素

40.组合总和II

看完题后的思路

在这里插入图片描述

  1. 本题是组合问题,元素有重复,结果中元素可以重复,但是要对重复的结果去重
    在这里插入图片描述

需改处: 同一层中,本元素如果与上一个元素相等,直接剪枝。
难点: 如何判断是本层 还是下一层
层去重的逻辑:
using: 表示尚在使用
初始using=false,当使用到我(加入数组),using=ture,执行完成,回溯时,using=false;
如果我前面的节点与我相同:
(1)using[前面的节点]=false;表示我前面的节点已经使用完回溯了,或者压根没用上
对于已经回溯完:我的结果肯定包含在前面结果中,所以我跳过
对于没用上,它被剪枝了,我俩一样,也肯定被剪枝
(2)using[前面的节点]=ture; 它一定在我前面,且正在使用,我一定是它的子节点。

代码

class Solution {
     List<List<Integer>> ires = new ArrayList<>();
    ArrayList<Integer> ipath = new ArrayList<>();
  public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        boolean[] using = new boolean[candidates.length];
        Arrays.sort(candidates);
        combinationSum2BT(candidates,target,0,0,using);
        return ires;
    }

    public void combinationSum2BT(int[] candidates, int target,int sum,int startIndex,boolean[] using) {// using[] 是否正在使用
        // 出口
        if (sum==target){
            ires.add(new ArrayList<>(ipath));
            return;
        }

        // 引擎
        for (; startIndex < candidates.length; startIndex++) {
            // 剪枝
            if (candidates[startIndex]+sum>target){
                return; // 因为是拍好序的
            }
            if (startIndex!=0&&candidates[startIndex-1]==candidates[startIndex]&&!using[startIndex-1]){
                continue;
            }
            
            using[startIndex]=true;
            ipath.add(candidates[startIndex]);
            combinationSum2BT(candidates,target,sum+candidates[startIndex],startIndex+1,using);

            // 回溯
            using[startIndex]=false;
            ipath.remove(ipath.size()-1);
            // 下一次
        }

    }

}

复杂度

在这里插入图片描述

收获

1. 三刷看一遍
2. 横向去重

131.分割回文串

在这里插入图片描述

  1. 这是一个标准切割问题
  2. v f(【】,startIndex)
  3. 出口 if(startIndex==数组长度){加入,return}
  4. 回溯
    与标准模板不同 ipath.add([].子串(startIndex,i))
  5. 剪枝
    不是回文串 continus
    直接看代码

代码

class Solution {
 List<List<String>> sres = new ArrayList<>();
    ArrayList<String> spath = new ArrayList<>();
    public List<List<String>> partition(String s) {
        partitionBT(s,0);
        return sres;
    }

    public void partitionBT(String s,int startIndex) {
        if (startIndex==s.length()){
            sres.add(new ArrayList<>(spath));
            return;
        }
        // 引擎
        for (int i = startIndex; i <s.length() ; i++) {
            // 剪枝
            if (!isPalindrome(s,startIndex,i)){
                 continue;
            }
            spath.add(s.substring(startIndex,i+1));
            partitionBT(s,i+1);
            spath.remove(spath.size()-1);
            // 本层下一个
        }
    }

    //判断是否是回文串
    private boolean isPalindrome(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;
    }
}

复杂度

在这里插入图片描述

收获

  1. 标准分割问题
  2. 三刷敲一遍

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

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

相关文章

HTTPS为什么就安全了?我们做了什么?

目录 一 安全概念 二 HTTPS的安全措施 三 总结 一 安全概念 网络安全是一个比较笼统的概念。我们说网络安全的时候&#xff0c;往往会包含很多安全问题&#xff0c;包括网络设备层面、通信过程、数据本身等多方面引入的安全问题。比如设备被有意无意的破坏&#xff0c;链路…

微搭低代码从入门到精通-03 创建模型应用

我们在进行低代码开发的时候&#xff0c;第一个需要建立的概念就是应用。不管你开发的是小程序还是管理系统&#xff0c;最终的承载物就是应用。 而我们创建应用是一共可以创建两种类型的应用&#xff0c;自定义应用和模型应用。自定义应用对应着一页多端&#xff0c;你开发一…

【Hello Linux】 Linux的权限以及Shell原理

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的基础命令 Linux的权限以及Shell原理Shell的运行原理权限Linux中权限的概念如何切换用户如何提升当前操作的权限如何添加信任…

【C++:STL之栈和队列 | 模拟实现 | 优先级队列 】

目录 1. stack的介绍和使用 1.1 stack的介绍 1.2 stack的使用 2 栈的模拟实现 3 queue的介绍和使用 3.1 queue的介绍 3.2 queue的使用 4 queue的模拟实现 5 deque的介绍 5.1deque的原理介绍 5.2 deque的缺陷 5.3 为什么选择deque作为stack和queue的底层默认容器 6 p…

nodejs+vue+elementui在线求助系统vscode

目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进…

加载sklearn covtype数据集出错 fetch_covtype() HTTPError: HTTP Error 403: Forbidden解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

微搭低代码从入门到精通07-基础布局组件

低码开发不同于传统开发&#xff0c;传统开发我们通常需要编写前端代码和后端代码。前端代码由HTML、CSS和JavaScript组成&#xff0c;后端代码我们通常要用后端语言比如Java来编写接口。 低码开发的特点是可视化开发&#xff0c;在编辑器中通过组件的拖拽来完成页面的编制。如…

莽村李青都看得懂的Vue响应式原理

Vue响应式原理八股文序违背老祖宗的决定将Vue响应式原理公众于世响应式数据&#xff08;Observe篇&#xff09;dom更新&#xff08;Wacther篇&#xff09;依赖收集八股文序 开篇来一段大家都会背诵的八股文。 某面试官&#xff1a; 请你简要介绍一下Vue的响应式原理。 答&am…

leaflet 读取上传的wkt文件,转换为geojson文件(示例代码056)

第056个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中上传WKT文件,解析wtk文件并转换为geojson,并在地图上显示图片。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式本示例所用的a.wkt示例源代码(共139行)…

AirServer在哪下载?如何免费使用教程

苹果手机投屏到电脑mac是怎么弄&#xff1f;你知道多少&#xff1f;相信大家对苹果手机投屏到电脑mac能在电脑上操作不是很了解&#xff0c;下面就让coco玛奇朵带大家一起了解一下教程。AIrServer是一款ios投屏到mac的专用软件&#xff0c;可将iOS上的音频&#xff0c;视频&…

make的使用及Makefile万能模板

make的使用及Makefile万能模板前言为什么用makemake的使用Makefile万能模板前言 gcc 的编译&#xff0c;是将源码生成可执行程序。 例如&#xff1a; gcc hello.c -o hello源码到可执行程序需要四步处理 硬件——》机器语言——》汇编语言——》 高级语言 1&#xff09;预处理…

【openGauss实战8】Schema的图文解读

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Session与Cookie的区别(三)

中场休息 让我们先从比喻回到网络世界里&#xff0c;HTTP 是无状态的&#xff0c;所以每一个 Request 都是不相关的&#xff0c;就像是对小明来说每一位客人都是新的客人一样&#xff0c;他根本不知道谁是谁。 既然你没办法把他们关联&#xff0c;就代表状态这件事情也不存在。…

微搭低代码从入门到精通08-轮播容器

我们上一篇讲解了基础布局组件&#xff0c;讲解了普通容器和文本组件的用法&#xff0c;本篇我们继续介绍布局组件。 小程序中经常会有个功能是轮播图展示的功能&#xff0c;多张图片可以顺序进行切换。我们学习使用轮播容器的时候&#xff0c;先考虑切换的图片从哪来&#xf…

视频连载09 - 这个为生信学习和生信作图打造的开源R教程真香!!!

点击阅读原文跳转完整教案。1 思考题2 R基础2.1 R安装2.2 Rstudio基础2.2.1 Rstudio版本2.2.2 Rstudio安装2.2.3 Rstudio 使用2.3 R基本语法2.3.1 获取帮助文档&#xff0c;查看命令或函数的使用方法、事例或适用范围2.3.2 R中的变量及其初始化2.3.3 变量类型和转换2.3.4 R中矩…

Python-项目实战--贪吃蛇小游戏(1)

1.贪吃蛇游戏规则贪吃蛇游戏规则如下:1.1开始和结束贪吃蛇初始出现在游戏窗口的左上角位置,体长共有3节游戏过程中&#xff0c;一旦蛇头撞到了窗口的边缘或者身体的其他部位,游戏结束游戏过程中&#xff0c;点击游戏窗口的关闭按钮&#xff0c;或者按下ESC键可以直接退出游戏一…

Java高级-常用类-String、Date、Compare、Other

本篇讲解java常用类 String类 String:字符串&#xff0c;使用一对""引起来表示。 String类被声明为final的&#xff0c;不可被继承。 String实现了Serializable接口&#xff1a;表示字符串是支持序列化的。 ​ 实现了Comparable接口&#xff1a;表示String可以比较…

微搭低代码从入门到精通09-数据容器

我们已经用了两篇的篇幅介绍了微搭的布局组件&#xff0c;包括普通容器、文本、图片、轮播容器。 微搭中还有粗粒度的组件&#xff0c;今天介绍的数据容器就是粗粒度的组件。所谓粗粒度的组件&#xff0c;一般包括基础组件、样式还有默认的事件。数据容器一共包含三种分别是数…

vscode sftp从linux服务器下载文件至本地:No such file or dictionary【已解决】

在服务器跑完程序需要下载数据的时候报错&#xff1a; [warn] ENOENT: no such file or directory, open /home/LIST_2080Ti/.ssh/config load /home/LIST_2080Ti/.ssh/config failed 完整报错内容如下&#xff1a; [02-10 08:38:47] [info] config at /home/LIST_2080Ti {&q…

Arm-Linux子系统的互相Notify

前言&#xff1a; Linux下面不同的子系统一个个的组成了整个系统的运行环节&#xff0c;为了让这些子系统能够互相通讯&#xff0c;有一种叫做&#xff1a;notify chain(通知链)的东西。本篇看下。 概括 所谓通知链&#xff0c;有通知&#xff0c;就有执行的地方。比如A子系统通…