代码随想录刷题题Day22

news2024/9/25 9:39:59

刷题的第二十二天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++
Day22 任务
● 39. 组合总和
● 40.组合总和II
● 131.分割回文串

1 组合总和

39. 组合总和
在这里插入图片描述
思路:
s

本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回

(1)递归函数参数
参数:集合candidates、目标值target、sum、startIndex(控制for循环的起始位置)
返回值:void

vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& candidates, int target, int sum, int startIndex)

(2)递归终止条件

终止只有两种情况,sum大于target和sum等于target

if (sum > target) return;
if (sum == target) {
	result.push_back(path);
	return;
}

(3)单层递归逻辑
元素为可重复选取的,所以递归相比之前做过的有变化

for (int i = startIndex; i < candidates.size(); i++) {
	sum += candidates[i];
	path.push_back(candidates[i]);
	backtracking(candidates, target, sum, i); // 关键点:不用i+1了,表示可以重复读取当前的数
	sum -= candidates[i];// 回溯
	path.pop_back();// 回溯
}

C++:

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {
        if (sum > target) return;
        if (sum == target) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i < candidates.size(); i++) {
            sum += candidates[i];
            path.push_back(candidates[i]);
            backtracking(candidates, target, sum, i);
            sum -= candidates[i];
            path.pop_back();
        }

    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        backtracking(candidates, target, 0, 0);
        return result;
    }
};

剪枝优化:
在这里插入图片描述
其实如果已经知道下一层的sum会大于target,就没有必要进入下一层递归
在这里插入图片描述
剪枝优化C++:

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {
        if (sum == target) {
            result.push_back(path);
            return;
        }
        // 如果 sum + candidates[i] > target 就终止遍历
        for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
            sum += candidates[i];
            path.push_back(candidates[i]);
            backtracking(candidates, target, sum, i);
            sum -= candidates[i];
            path.pop_back();
        }

    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0, 0);
        return result;
    }
};

时间复杂度: O ( n ∗ 2 n ) O(n * 2^n) O(n2n)
空间复杂度: O ( t a r g e t ) O(target) O(target)

2 组合总和II

40.组合总和II
在这里插入图片描述
思路:
(1)本题candidates 中的每个数字在每个组合中只能使用一次
(2)candidates的元素是有重复的,解集不能包含重复的组合
需要做去重处理

使用过,在树形结构上有两个维度,一个维度是在同一树枝上使用过,一个维度是在同一数层上使用过。

要去重的是同一树层上的“使用过”,同一树枝上的都是一个组合里的元素,不用去重。
数层去重,需要对数组排序
在这里插入图片描述
(1)递归函数参数
bool型数组used:记录同一树枝上的元素是否使用过

vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used)

(2)递归终止条件

if (sum >  target) return;
if (sum == target) {
	result.push_back(path);
	return;
}

(3)单层搜索的逻辑
如果candidates[i] == candidates[i - 1] 并且 used[i - 1] == false, 说明:前一个树枝,使用了candidates[i - 1],也就是说同一树层使用过candidates[i - 1]
在这里插入图片描述

used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
used[i - 1] == false,说明同一树层candidates[i - 1]使用过

for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
	if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) continue;
	sum += candidates[i];
	path.push_back(candidates[i]);
	used[i] = true;
	backtracking(candidates, target, sum, i + 1, used);
	used[i] = false;
	sum -= candidates[i];
	path.pop_back();
}

C++:

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used) {
        if (sum == target) {
            result.push_back(path);
        }
        for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
        	// used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
            // used[i - 1] == false,说明同一树层candidates[i - 1]使用过
            // 要对同一树层使用过的元素进行跳过
            if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) continue;
            path.push_back(candidates[i]);
            sum += candidates[i];
            used[i] = true;
            backtracking(candidates, target, sum, i + 1, used);
            sum -= candidates[i];
            used[i] = false;
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<bool> used(candidates.size(), false);
        // 首先把给candidates排序,让其相同的元素都挨在一起
        sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0, 0, used);
        return result;
    }
};

3 分割回文串

131.分割回文串
在这里插入图片描述
思路:

  1. 切割问题,有不同的切割方式
  2. 判断回文

切割问题类似组合问题

对于字符串abcdef:
组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个…。
切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段…。

在这里插入图片描述
(1)递归函数参数

vector<vector<string>> result;
vector<string> path;
void backtracking(const string& s, int startIndex)

(2)递归函数终止条件:切割线切到了字符串最后面
在这里插入图片描述

if (startIndex >= s.size()) {
	// 如果起始位置已经大于s的大小,说明已经找到了一组分割方案
	result.push_back(path);
	return;
}

(3)单层搜索的逻辑
[startIndex, i] 就是要截取的子串

首先判断这个子串是不是回文,如果是回文,就加入在vector<string> path中,path用来记录切割过的回文子串

for (int i = startIndex; i < s.size(); i++) {
	if (isPalindrome(s, startIndex, i)) {// 是回文子串
		// 获取[startIndex,i]在s中的子串
		string str = s.substr(startIndex, i - startIndex + 1);
		path.push_back(str);
	} else {
		continue;
	}
	backtracking(s, i + 1);
	path.pop_back();
}

判断回文子串

bool isPalindrome(const string& s, int start, int end) {
	for (int i = start, j = end; i < j; i++, j--) {
		if (s[i] != s[j]) return false;
	}
	return true;
}

C++:

class Solution {
public:
    vector<string> path;
    vector<vector<string>> result;
    void backtracking(const string& s, int startIndex) {
        if (startIndex >= s.size()) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i < s.size(); i++) {
            if (isPalindrome(s, startIndex, i)) {// 是回文子串
            	// 获取[startIndex,i]在s中的子串
                string str = s.substr(startIndex, i - startIndex + 1);
                path.push_back(str);
            } else continue;// 不是回文,跳过
            backtracking(s, i + 1);// 寻找i+1为起始位置的子串
            path.pop_back();// 回溯过程,弹出本次已经添加的子串
        }
    }
    bool isPalindrome(const string& s, int start, int end) {
        for (int i = start, j = end; i < j; i++, j--) {
            if (s[i] != s[j]) return false;
        }
        return true;
    }
    vector<vector<string>> partition(string s) {
        path.clear();
        result.clear();
        backtracking(s, 0);
        return result;
    }
};

时间复杂度: O ( n ∗ 2 n ) O(n * 2^n) O(n2n)
空间复杂度: O ( n 2 ) O(n^2) O(n2)


鼓励坚持二十三天的自己😀😀😀

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

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

相关文章

视频剪辑去哪里找素材,全部正版高清~

做视频剪辑的小伙伴们经常会用到视频素材&#xff0c;所以&#xff0c;今天给大家推荐几个我常用的高清视频素材网站&#xff1a; 1、制片帮素材 网址&#xff1a;https://stock.zhipianbang.com/ 制片帮素材是一个专业视频素材的网站&#xff0c;站内有超多高清视频模板、实…

效率必备神器

在这个快节奏的工作环境中&#xff0c;使用一些强大的工作软件来提高工作效率和组织工作流程变得异常重要。无论是个人任务管理还是团队协作&#xff0c;合适的工作软件都能极大地改善工作质量和生产力。让我们深入了解一些我个人强力推荐的工作软件&#xff0c;希望能给你带来…

【Spring】SpringBoot 配置文件

文章目录 什么是配置文件SpringBoot配置文件配置文件快速入手配置文件的格式properties 配置文件说明properties 基本语法读取配置文件信息properties 配置格式缺点 yml 配置文件说明yml 基本语法使用 yml 连接数据库 yml 使用进阶yml 配置不同数据类型配置对象配置集合配置Map…

redis 从0到1完整学习 (八):QuickList 数据结构

文章目录 1. 引言2. redis 源码下载3. quickList 数据结构3.1 整体3.2 数据结构 4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a…

强化学习_06_pytorch-TD3实践(CarRacing-v2)

0、TD3算法原理简介 详见笔者前一篇实践强化学习_06_pytorch-TD3实践(BipedalWalkerHardcore-v3) 1、CarRacing环境观察及调整 Action SpaceBox([-1. 0. 0.], 1.0, (3,), float32)Observation SpaceBox(0, 255, (96, 96, 3), uint8) 动作空间是[-1~1, 0~1, 0~1]&#xff0c…

巅峰画师Midjourney:新时代的独角兽

介绍 AI绘画领域中&#xff0c;Midjourney处于绝对地位&#xff0c;并且一年时间就登顶。 Midjourney是一家独立的AI研究实验室,探索新的思维媒介,拓展人类的想象力。 它由一个小型的自筹资金团队组成,专注于设计、人类基础设施和AI。 在AI绘画领域,Midjourney取得了非常突出…

LAMP集中式搭建+LNMP分布式搭建(新版)

LAMP搭建LNMP搭建 LAMP搭建LNMP搭建一、LAMP搭建(集中式)1、LAMP简介2、LAMP组件及作用3、编译安装Apache httpd服务4、编译安装mysqld 服务5、编译安装PHP解析环境6、安装论坛7、安装博客 二、LNMP搭建(分布式)1、LNMP工作原理2、安装nginx3、安装mysql4、安装php5、在浏览器测…

【网络安全/CTF】easyphp 江苏工匠杯

本题考察PHP语言相关绕过知识 正文 开门见山给代码 <?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),…

Centos安装Composer

今天分享下如何在centos系统里安装composer 一、下载composer curl -sS https://getcomposer.org/installer | php二、移动或复制composer到环境下可执行 cp composer.phar /usr/local/bin/composer三、测试看是否安装成功 composer -V四、全局安装 curl -sS https://getc…

zabbix-邮件告警与钉钉机器人告警

zabbix-邮件告警 在部署邮件告警前需要先将zabbix部署成功 邮件告警需要得到邮箱的授权码&#xff0c;这里将以qq邮箱为例。 1.获取邮箱的授权码 2.编辑Email的相关信息 3.测试Email是否配置成功 测试成功。 4.为用户添加邮箱报警服务 5.创建主机群组、主机、监视项、触…

Kylin-Desktop-V10-SP1-General-Release-2303-X86_64-海光版(hygon c86)下载

csdn下载 【免费】Kylin-Desktop-V10-SP1-General-Release-2303-X86-64-海光版-001资源-CSDN文库 【免费】Kylin-Desktop-V10-SP1-General-Release-2303-X86-64-海光版-002资源-CSDN文库 【免费】Kylin-Desktop-V10-SP1-General-Release-2303-X86-64-海光版003资源-CSDN文库…

【k8s源码分析-Apiserver-2】kube-apiserver 结构概览以及主体部分源码分析

参考 Kubernetes 源码剖析&#xff08;书籍&#xff09;kube-apiserver的设计与实现 - 自记小屋 kube-apiserver 核心思想 APIGroupInfo 记录 GVK 与 Storage 的对应关系 将 GVK 转换成&#xff0c;Restful HTTP Path将 Storage 封装成 HTTP Handler将上面两个形成映射&#…

Unity人物移动的几种方法

Unity人物移动的几种方法 方法一&#xff1a;transform.Translate世界坐标系移动自身移动的案例 方法二&#xff1a;CharacterController.Move&#xff08;vector dir&#xff09;按照世界坐标轴移动按照自身坐标轴移动 方法三&#xff1a;CharacterController.SimpleMove&…

年终盘点文生图的狂飙之路,2023年文生图卷到什么程度了?

目录 前言发展1月2月3月4月5月6月7月9月10月11月12月 思考与总结参考文献 前言 说到文生图&#xff0c;可能有些人不清楚&#xff0c;但要说AI绘画&#xff0c;就有很多人直呼&#xff1a; 2022可以说是AI绘图大爆发的元年。 AI绘画模型可以分为扩散模型&#xff08;Diffusio…

ElasticSearch 使用映射定义索引结构

动态映射 dynamic 可选值解释true默认值&#xff0c;启用动态映射&#xff0c;新增的字段会添加到映射中runtime查询时动态添加到映射中false禁用动态映射&#xff0c;忽略未知字段strict发现未知字段&#xff0c;抛出异常 显示映射 创建映射 PUT user {"mappings&qu…

《钢结构设计标准》中抗震性能化设计的概念

文章目录 0. 背景1. 前言2. 什么是抗震性能化设计3. 我国规范是如何实现性能化设计的4. 从能量角度理解性能化设计05. 《钢结构设计标准》抗震性能化设计的思路06. 《钢结构设计标准》抗震性能化设计的步骤 0. 背景 关于抗震性能化设计&#xff0c;之前一直理解的很模糊&#…

售前工程师宝典:整理服务器最全知识点

如何保证服务器可以支持百万用户访问&#xff1f;服务器品牌有哪些&#xff1f;如何选购服务器&#xff1f;对于这些问题&#xff0c;今天我们就一起来看下关于服务器的相关知识。 假如你开发了一个网站或者一个app把他放到服务器上&#xff0c;之后你把它发布到了网上&#x…

Matlab/Simulink的一些功能用法笔记(3)

01--引言 最近加入到一个项目组&#xff0c;有一些测试需要去支持&#xff0c;通过了解原先团队的测试方法后&#xff0c;自己作了如下改善&#xff0c;大大提高了工作效率。这也许就是软件开发的意义吧&#xff0c;能够去除一些重复的机械的人工操作并且结果还非常不可靠。 …

一位年薪35W的全栈开发被开除,回怼的一番话,令人沉思

一位年薪35W开发工程师被开除回怼道&#xff1a;“反正我有技术&#xff0c;在哪不一样” 一技傍身&#xff0c;万事不愁&#xff0c;当我们掌握了一技之长后&#xff0c;在职场上说话就硬气了许多&#xff0c;不用担心被炒&#xff0c;反过来还可以炒了老板&#xff0c;这一点…

iOS苹果App应用程序上架后提示有三方登入是怎么回事?如何解决?

Hello大家好&#xff01;我是咕噜铁蛋&#xff01;现在越来越多的 App 都提供了三方登入功能&#xff0c;比如使用微信、QQ、微博等社交媒体账号登入。但是&#xff0c;有些开发者在将 App 上架到苹果应用商店时&#xff0c;会遇到提示“您的应用程序使用了第三方登录”的问题。…