【代码随想录day23】【C++复健】39. 组合总和;40.组合总和II; 131.分割回文串

39. 组合总和

本题一开始做的时候没想明白要不要先进行一下排序,没排序的代码试着提交了一下就直接过了。仔细想了一下首先这道题的元素可以无限取,其次每个元素只会出现一次,也就是说不会出现重复。而排序的目的实际是为了去重,所以本题不需要进行排序。

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> result;
        vector<int> path;
        int startindex = 0;
        comb(result, path, candidates, target, startindex);
        return result;
    }
    void comb(vector<vector<int>>& result, vector<int>& path, vector<int>& candidates, int target, int startindex){
        if(target == 0){
            if(!path.empty()){
                result.push_back(path);
            }
            return ;
        }
        else if(target < 0){
            return ;
        }
        for(int i = startindex; i < candidates.size(); i++){
            path.push_back(candidates[i]);
            comb(result, path, candidates, target - candidates[i], i);
            path.pop_back();
        }
    }
};

40.组合总和II

本题来说还是遇到了较多的问题的,一一列举记录一下:
1 c++的sort方法不会用,写成了sort(candidates);,但实际上正确的写法是sort(candidates.begin(), candidates.end());,也就是说要传两个迭代器而不是整个vector。

2 在写循环逻辑的时候写成了:

while(candidates[i] == candidates[startindex]){
    i++;
}

但实际正确的逻辑是:

if (i > startindex && candidates[i] == candidates[i - 1]) continue;

为什么第一种是对的,第二种就是错的呢?

第一种实际上存在两个问题:
1 我用while循环找到第一个不同的元素,但其实外面还嵌套了一层for循环,在下一个循环的时候还会++,导致跳过一个不同的元素。

2 不应该与candidates[startindex]而应该是与candidates[i]进行比较,这是因为:startindex只是这个for循环的起始节点,但是在后续的for循环当中,也需要进行去重操作,如果与startindex进行比较的话,相当于只与开头的元素进行比较,在逻辑上是错的。

所以最终补全了逻辑的for循环其实得这么写:

        for(int i=startindex; i<candidates.size();){
            // if (i > startindex && candidates[i] == candidates[i - 1]) continue;
            path.push_back(candidates[i]);
            comb(candidates, target - candidates[i], i+1, result, path);
            path.pop_back();
            int p = 0;
            int current = candidates[i];
            while(i+p <candidates.size() && candidates[i+p] == current){
                p++;
            }
            if(p > 0){
                i += p;
            }
            else{
                i += 1;
            }
        }

在这个逻辑当中,相当于去掉了有重复元素的时候的自动++操作,并且也正确的将比较对象调成了candidates[i]。

相比之下其实卡哥的代码就简单很多了,首先是只和前一个元素进行比较,不用纠结到底是startindex还是i,其次是每次只会在满足条件时跳过当前循环,不会像我一样算半天需要跳过几个循环,然后跳错,是负担较低且好写的写法。至于我为什么没想到,是因为这种去重逻辑其实正着想还挺难的(个人认为),看到代码之后倒推反而是好理解的。

卡哥解析里面那个同一树层什么的给我看挺懵逼的,从代码倒退回去讲的话,其实就是相同的数字第二次出现,其实就已经重复了,因为它的上一个元素不取它这一个其实就和从它这里开始,得到的结果是一样的。那所以此时需要判断两件事:

1 现在的这个元素并非起始元素,也就是i>startindex

2 此时的元素是第二次及以上出现,也就是和前一个元素相等了

满足上述的两个条件之后,执行跳过逻辑,最终写出来的代码如下。

class Solution {
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        int startindex = 0;
        vector<vector<int>> result;
        vector<int> path;
        comb(candidates, target, startindex, result, path);
        return result;
    }
    void comb(vector<int>& candidates, int target, int startindex, vector<vector<int>>& result, vector<int>& path){
        if(target == 0){
            if(!path.empty()){
                result.push_back(path);
            }
            return ;
        }
        else if(target < 0){
            return ;
        }
        for(int i=startindex; i<candidates.size();){
            if (i > startindex && candidates[i] == candidates[i - 1]) continue;
            path.push_back(candidates[i]);
            comb(candidates, target - candidates[i], i+1, result, path);
            path.pop_back();
            int p = 0;
            int current = candidates[i];
        }
    }
};

131.分割回文串

回溯的部分其实我一周目并没做过,这题也并没有思路。看了卡哥的解析才知道得划为两个部分:

1 找切割点

2 判断回文

我就属于想要用一段代码把两件事都做了,其实这个是不太现实的,饭要一口一口的吃。

那看完解析之后自己去实现,相对来说就简单很多了,不过也遇到了一些问题:
1 substr又忘了怎么用了,这回倒是记得传下标了,但又忘记第二个参数要传长度了,传了俩下标进去,自然是错的。

2 边界条件写成startindex >= s.size()了,这样其实是会导致越界问题的。

class Solution {
public:
    vector<vector<string>> partition(string s) {
        vector<vector<string>> result;
        vector<string> path;
        int startindex = 0;
        part(s, startindex, result, path);
        return result;
    }
    void part(string s, int startindex, vector<vector<string>>& result, vector<string>& path){
        if(startindex >= s.size()){
            if(!path.empty()){
                result.push_back(path);
            }
            return;
        }
        for(int i=startindex; i<s.size();i++){
            if(judge(s, startindex, i)){
                path.push_back(s.substr(startindex, i - startindex + 1));
                part(s, i+1, result, path);
                path.pop_back();
            }
            else{
                continue;
            }
        }
    }
    bool judge(string s, int left, int right){
        for(int i=left, j = right; i <= j;i++,j--){
            if(s[i] != s[j]){
                return false;
            }
        }
        return true;
    }
};

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

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

相关文章

精心整理教育研究专题数据资源大全-最新出炉_附下载链接

教育研究专题数据资源大全V1.0 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;教育研究专题数据资源大全-最新出炉.zip 资源介绍 一、中国教育统计年鉴面板数据 简介&#xff1a;《中国教育统计年鉴》是由教育部发展规划司根据全国各省、自治区、直辖市…

【论文速读】| PathSeeker:使用基于强化学习的越狱攻击方法探索大语言模型的安全漏洞

基本信息 原文标题: PathSeeker: Exploring LLM Security Vulnerabilities with a Reinforcement Learning-Based Jailbreak Approach 原文作者: Zhihao Lin, Wei Ma, Mingyi Zhou, Yanjie Zhao, Haoyu Wang, Yang Liu, Jun Wang, Li Li 作者单位: Beihang University, Nany…

越权访问漏洞

V2Board Admin.php 越权访问漏洞 ## 漏洞描述 V2board面板 Admin.php 存在越权访问漏洞&#xff0c;由于部分鉴权代码于v1.6.1版本进行了修改&#xff0c;鉴权方式变为从Redis中获取缓存判定是否存在可以调用… V2Board Admin.php 越权访问漏洞 漏洞描述 V2board面板 Admin.ph…

27.旅游推荐管理系统(基于springboot和vue)

目录 1.系统的受众说明 2. 系统需求分析 2.1 任务概述 2.2 功能性需求 2.3 非功能性需求 2.3.1正确性需求 2.3.2安全性需求 2.3.3界面需求 2.3.4时间特殊性需求 2.3.5稳定性需求 2.3.6故障处理能力需求 2.4 开发技术简介 2.4.1 开发工具简介 2.4.2 开发技术…

CCS下载安装(以12.3.0版本为例)

Code Composer Studio 是一个集成开发环境 (IDE)&#xff0c;简称CCS软件。支持 TI 的微控制器和嵌入式处理器产品的开发。Code Composer Studio 包含一整套用于开发和调试嵌入式应用程序的工具。 CCS9.3.0及以上版本不需要License文件&#xff0c;但是CCS旧版本比如CCS5.5.0需…

基于单片机的变频空调系统设计(论文+源码)

1系统总体方案设计 本次基于单片机的变频空调系统设计&#xff0c;选用STC89C52单片机作为系统的主控核心&#xff0c;结合DHT11温湿度传感器实现家居环境中温湿度数据的检测&#xff0c;并设有自动和手动两种模式&#xff0c;在自动模式下&#xff0c;系统会根据按键设定的温…

Visual Studio Code从安装到正常使用

Visual Studio Code的汉化 下载的Visual Studio Code的话可以去应用商店也可以去官网下载。 Visual Studio Code只是一个编译器&#xff0c;不具备编译器功能。因此需要下载一个编译器MinGW MinGW的安装 官网链接MinGW官网链接 一步到位的链接 添加环境变量 进入cmd界面…

图神经网络初步实验

实验复现来源 https://zhuanlan.zhihu.com/p/603486955 该文章主要解决问题&#xff1a; 1.加深对图神经网络数据集的理解 2.加深对图神经网络模型中喂数据中维度变化的理解 原理问题在另一篇文章分析&#xff1a; 介绍数据集&#xff1a;cora数据集 其中的主要内容表示为…

雪花算法生成的ID在返回给前端之后和生成的不一样,到底是什么原因?

一、背景&#xff1a; 最近在做项目的时候发现用雪花算法生成的id传给前端以后跟生成的不一样&#xff0c;就纳闷&#xff0c;在想为什么会出现这样的问题&#xff1f; 二、问题分析&#xff1a; 最开始以为是序列化的问题导致的仔细对比以后发现前端是后几位不一样都是0&…

【大数据学习 | kafka高级部分】kafka中的选举机制

controller的选举 首先第一个选举就是借助于zookeeper的controller的选举 第一个就是controller的选举&#xff0c;这个选举是借助于zookeeper的独享锁实现的&#xff0c;先启动的broker会在zookeeper的/contoller节点上面增加一个broker信息&#xff0c;谁创建成功了谁就是主…

js例轮播图定时器版

要求 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevice-width, ini…

jvm学习笔记-轻量级锁内存模型

一&#xff0c;轻量级锁 LockRecord的那个第一个成员变量是拷贝对应锁定了的java对象资源的MarkWord&#xff0c;Lock Record有一个Ptr指针刚开始指向自己&#xff0c;后面这个指针存储在锁定资源的java对象的markword中&#xff0c;后续可以通过java对象的MarkWord快速定位到…

职场浅谈:情商高的“4”种表现,情商高的人才更容易走向成功

职场上&#xff0c;情商高的人总是让人感觉很舒服&#xff0c;也让人情不自禁的愿意和他交往。高情商的人&#xff0c;最大的优点就是让人感觉舒服&#xff0c;这种舒服由内自外&#xff0c;让你情不自禁的对他产生好感&#xff0c;并且发自内心的愿意和他在一起&#xff0c;也…

win11电脑无法找到声音输出设备怎么办?查看解决方法

电脑无法找到声音输出设备是一个常见的问题&#xff0c;尤其是在使用Windows操作系统时。幸运的是&#xff0c;大部分问题都可以通过以下几种方法来解决。 一、检查物理连接 在深入诊断之前&#xff0c;首先要检查硬件连接是否正常。这包括&#xff1a; 确保耳机、扬声器或其…

大模型微调技术 --> LoRA 系列之 QLoRA (省资源能手)

QLoRA 1.摘要 作者提出了QLoRA&#xff0c;一种有效的微调方法&#xff0c;可以减少内存使用&#xff0c;足以在单个48 GB GPU上微调 65B 参数模型&#xff0c;同时保留完整的 16位 微调任务性能。 QLoRA 通过冻结的4位量化预训练语言模型将梯度反向传播到低秩适配器&#x…

Vert.x,应用监控 - 基于Micrometer / Prometheus

对于企业级的应用程序来说&#xff0c;我们需要通过运行指标(metrics)的监控&#xff0c;来了解(监控)程序的运行状态。Vert.x的核心组件内置了大量的运行指标&#xff0c;并支持通过Micrometer来管理这些运行指标并向后端报告。 目前Vertx内置运行指标的核心组件包括: TCP/HTT…

如何用PPT画箭头?用这2个ppt软件快速完成绘图!

ppt怎么画箭头&#xff1f; 有时在ppt中绘制流程图或传达承上启下的含义时&#xff0c;会用到箭头形状&#xff0c;运用到箭头元素来增强表达的清晰度和逻辑性。那可能有人会问&#xff0c;ppt怎么画箭头&#xff1f; 这似乎是一个小问题&#xff0c;但如果你对ppt工具不够熟…

java: 无法访问org.springframework.web.bind.annotation.RequestMapping

一、报错问题 java: 无法访问org.springframework.web.bind.annotation.RequestMapping 二、原因分析 SpringBoot使用了3.0或者3.0以上&#xff0c;因为Spring官方发布从Spring6以及SprinBoot3.0开始最低支持JDK17。所以仅需要将SpringBoot版本降低为3.0以下即可&#xff08;或…

[ DOS 命令基础 3 ] DOS 命令详解-文件操作相关命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

【TS】九天学会TS语法——3.TypeScript 函数

今天学习 TypeScript 的函数&#xff0c;包括函数类型、可选参数、默认参数、剩余参数。 函数声明和表达式函数类型可选参数和默认参数剩余参数 在 TypeScript 中&#xff0c;函数是编程的核心概念之一。它们允许我们将代码组织成可重用的块&#xff0c;并提供了强大的抽象能力…