day27 组合总和 组合总和Ⅱ 分割回文串

题目1:39 组合总和

题目链接:39 组合总和

题意

找出无重复元素的正整数数组candidates中元素和为目标数target的所有不同组合,同一个数字可重复选取

回溯

回溯三部曲:

1)参数和返回值

2)终止条件

3)单层搜索逻辑

代码

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& candidates,int targetsum,int sum,int startIndex){if(sum>targetsum) return;//终止条件if(sum==targetsum){result.push_back(path);return;}//单层递归逻辑for(int i=startIndex;i<candidates.size();i++){sum += candidates[i];path.push_back(candidates[i]);backtracking(candidates,targetsum,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+candidates[i])大于targetsum,那么该分支及其后面的分支没有必要存在了,因为和肯定都大于target了

代码

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& candidates,int targetsum,int sum,int startIndex){//终止条件if(sum==targetsum){result.push_back(path);return;}//单层递归逻辑//注意限制条件是<= 一定要包含等于,因为还要将candidates[i]放入path数组中for(int i=startIndex;i<candidates.size()&&sum+candidates[i]<=targetsum;i++){sum += candidates[i];path.push_back(candidates[i]);backtracking(candidates,targetsum,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(target)

题目2:组合总和Ⅱ

题目链接:40 组合总和Ⅱ

题意

找出正整数数组candidates中使得元素和为target的组合,组合不能重复,数组中每个元素只能使用1次,但是candidates中可能存在重复的元素 例如 [2,2,2] target=4 只有1个组合满足[2 2]要求

回溯

回溯三部曲:

1)参数和返回值

2)终止条件

3)单层递归逻辑

本题主要是包含去重的操作  将数组按照增序排列,将相同的元素放在紧邻的位置

代码

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& candidates,int targetsum,int sum,int startIndex,vector<bool>& used){//终止条件if(sum>targetsum) return;if(sum==targetsum){result.push_back(path);return;}//单层递归逻辑for(int i=startIndex;i<candidates.size();i++){//树层去重if(i>0 && candidates[i]==candidates[i-1] && used[i-1]==0) continue;sum += candidates[i];path.push_back(candidates[i]);used[i] = true;backtracking(candidates,targetsum,sum,i+1,used);//递归sum -= candidates[i];//回溯path.pop_back();//回溯used[i] = false;//回溯}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {//对数组进行排序,使得数组中数值相等的元素可以相邻在一起,这样方便去重sort(candidates.begin(),candidates.end());vector<bool> used(candidates.size(),false); backtracking(candidates,target,0,0,used);return result;}
};
剪枝
class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& candidates,int targetsum,int sum,int startIndex,vector<bool>& used){//终止条件if(sum==targetsum){result.push_back(path);return;}//单层递归逻辑for(int i=startIndex;i<candidates.size()&&sum+candidates[i]<=targetsum;i++){//树层去重if(i>0 && candidates[i]==candidates[i-1] && used[i-1]==0) continue;sum += candidates[i];path.push_back(candidates[i]);used[i] = true;backtracking(candidates,targetsum,sum,i+1,used);//递归sum -= candidates[i];//回溯path.pop_back();//回溯used[i] = false;//回溯}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {//对数组进行排序,使得数组中数值相等的元素可以相邻在一起,这样方便去重sort(candidates.begin(),candidates.end());vector<bool> used(candidates.size(),false); backtracking(candidates,target,0,0,used);return result;}
};
  • 时间复杂度: O(n * 2^n)
  • 空间复杂度: O(n)

题目3:131 分割回文串

题目链接:131 分割回文串

题意

将字符串s(仅由小写字母组成)分割成若干回文子串  回文串是正读和反读相同的子串,返回分割方案

回溯

回溯三部曲:

1)参数和返回值

2)终止条件

3)单层搜索逻辑

代码

class Solution {
public://判断字符串是否是回文串bool ispalidrom(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<string> path;//存放单个分割结果vector<vector<string>> result;//存放所有分割方案void backtracking(const string& s,int startIndex){//终止条件if(startIndex==s.size()){result.push_back(path);//path中只存放是回文串的子串return;}//单层搜索逻辑for(int i=startIndex;i<s.size();i++){if(ispalidrom(s,startIndex,i)){//截取[statrIndex,i]的子串string str  = s.substr(startIndex,i-startIndex+1);path.push_back(str);}else continue;backtracking(s,i+1);//递归path.pop_back();//回溯}}vector<vector<string>> partition(string s) {backtracking(s,0);return result;}
};
  • 时间复杂度: O(n * 2^n)
  • 空间复杂度: O(n^2)

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

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

相关文章

php基础学习之常量

php常量的基本概念 常量是在程序运行中的一种不可改变的量&#xff08;数据&#xff09;&#xff0c;常量一旦定义&#xff0c;通常不可改变&#xff08;用户级别&#xff09;。 php常量的定义形式 使用define函数&#xff1a;define("常量名字", 常量值);使用cons…

EasyDarwin计划新增将各种流协议(RTSP、RTMP、HTTP、TCP、UDP)、文件转推RTMP到其他视频直播平台,支持转码H.264、文件直播推送

之前我们尝试做过EasyRTSPLive&#xff08;将RTSP流转推RTMP&#xff09;和EasyRTMPLive&#xff08;将各种RTSP/RTMP/HTTP/UDP流转推RTMP&#xff0c;这两个服务在市场上都得到了比较多的好评&#xff0c;其中&#xff1a; 1、EasyRTSPLive用的是EasyRTSPClient取流&#xff…

内网穿透的应用-如何使用Docker部署Redis数据库并结合内网穿透工具实现公网远程访问

文章目录 前言1. 安装Docker步骤2. 使用docker拉取redis镜像3. 启动redis容器4. 本地连接测试4.1 安装redis图形化界面工具4.2 使用RDM连接测试 5. 公网远程访问本地redis5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Ub…

RT-Thread 17. 中断发送信号量后线程去处理信号量

1. 代码 //sem.c #include <rtthread.h> #include <rtdevice.h> #include "drv_gpio.h"#define THREAD_PRIORITY 25 #define THREAD_TIMESLICE 5#define LED3_PIN GET_PIN(B, 3) ALIGN(RT_ALIGN_SIZE) static char thread3_stack[1024]; static struct…

【Spring 篇】MyBatis多表操作:编织数据的交响乐

欢迎来到MyBatis的多表操作世界&#xff01;在这个充满交响乐的舞台上&#xff0c;我们将探索如何巧妙地编织多个数据表的数据&#xff0c;创造出一场旋律动听的数据交响曲。无需繁琐的SQL拼接&#xff0c;MyBatis让多表操作变得优雅而简单。让我们一起进入这个音乐殿堂&#x…

司铭宇老师:房地产电话营销培训:房地产电话销售话术与销售技巧:打造高转化率的电话营销策略

房地产电话营销培训&#xff1a;房地产电话销售话术与销售技巧&#xff1a;打造高转化率的电话营销策略 在房地产销售中&#xff0c;电话销售是一种常见且有效的营销手段。它不仅可以快速触达潜在客户&#xff0c;还能够建立起销售人员与客户之间的初步信任关系。然而&#xff…

大模型学习之书生·浦语大模型6——基于OpenCompass大模型评测

基于OpenCompass大模型评测 关于评测的三个问题Why/What/How Why What 有许多任务评测&#xff0c;包括垂直领域 How 包含客观评测和主观评测&#xff0c;其中主观评测分人工和模型来评估。 提示词工程 主流评测框架 OpenCompass 能力框架 模型层能力层方法层工具层 支持丰富…

C++从小白到初级工程师【个人学习笔记】

目录 1.背景2.基础二维数组概念二维数组定义方式 二维数组数组名称概念例子 函数的分文件编写概念示例 指针指针的基本概念指针变量的定义和使用 空指针和野指针空指针实例野指针实例 const修饰指针概念const修饰指针 --- 常量指针 指针和数组作用示例 指针和函数作用示例 指针…

项目解决方案:某城区(区县)社会面视频监控资源接入汇聚解决方案

目 录 一、概述 二、建设目标及需求 1.建设目标 2.需求分析 2.1 总体需求 2.2 需求细化 三、方案设计 1.设计依据 2.设计原则 3.设计方案 3.1.方案描述 3.2.组网说明 四、产品介绍 1.视频监控综合资源管理平台介绍 2.视频录像服务器和存储 2.1…

python算法与数据结构(搜索算法和拓扑排序算法)---深度优先搜索

课程目标 了解树/图的深度遍历&#xff0c;宽度遍历基本原理&#xff1b;会使用python语言编写深度遍历&#xff0c;广度遍历代码&#xff1b;掌握拓扑排序算法 搜索算法的意义和作用 搜索引擎 提到搜索两个子&#xff0c;大家都应该会想到搜索引擎&#xff0c;搜索引擎的基…

网络安全(初版,以后会不断更新)

1.网络安全常识及术语 资产 任何对组织业务具有价值的信息资产&#xff0c;包括计算机硬件、通信设施、IT 环境、数据库、软件、文档 资料、信息服务和人员等。 漏洞 上边提到的“永恒之蓝”就是windows系统的漏洞 漏洞又被称为脆弱性或弱点&#xff08;Weakness&#xff09;&a…

DC-7靶机做题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1w2c_QKd_hOoR2AzNrdZjMg?pwdtdky 提取码&#xff1a;tdky 参考&#xff1a; DC7靶机地址&#xff1a;http://www.five86.com/downloads/DC-7.zipDC7靶场介绍: https://www.vulnhub.com/entry/dc-7,356/…

AI+量化02_金融市场的基础概念

文章目录 问答之纯小白 vs GPT4Q1. 请用尽可能简短的语句或例子&#xff0c;给小白讲解宏观经济Q2. 给小白讲解资本边际效率Q3. 如果证券没有风险是否意味着没有收益&#xff1f;Q4. 芒格&#xff1a;教人炒股&#xff0c;犹如引人吸毒Q5. 给小白快速讲解&#xff1a;卡房统计量…

计算机速成课Crash Course - 21. 压缩

更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 21. 压缩 (qq.com) 今天继续计算机速成课Crash Course的系列讲解。 21. 压缩 上集我们讨论了文件格式&#xff0c;如何…

IN操作符

目录 IN NOT IN Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 IN IN 指的是根据一个指定的范围进行数据查询 1.查询出员工编号是 7369、7566、7788、9999 的员工信息 利用前面学的知识,得出: SQL> set linesize 250 SQL>…

Docker(十一)Swarm mode

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Swarm mode Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎&#xff0c;成为了 docker 子命令 docker swarm。请注意与旧的 Docker Swarm …

力扣509. 斐波那契数

动态规划 思路&#xff1a; 斐波那契数通式&#xff1a;F(n) F(n - 1) F(n - 2)&#xff1b;以此为状态转移方程&#xff0c;对其进行动态规划&#xff1b;边界条件&#xff1a; F(0) 0F(1) 1使用两个变量来存储上一组结果&#xff1b; class Solution { public:int fib(…

Docker安装配置OnlyOffice

OnlyOffice 是一款强大的办公套件&#xff0c;你可以通过 Docker 轻松安装和部署它。本文将指导你完成安装过程。 步骤 1&#xff1a;拉取 OnlyOffice Docker 镜像 首先&#xff0c;使用以下命令从 Docker Hub 拉取 OnlyOffice Document Server 镜像&#xff1a; sudo docke…

计算机毕业设计 基于MVC的自习室管理和预约系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

如何用数据赋能社媒营销决策?

在数字化时代&#xff0c;越来越多的商家开始意识到数据分析对于改善经营的重要性。 传统决策更多依赖过往经验、商业直觉、他人的思路模板等方法&#xff0c;或者依靠描述性统计、简单的数据分析。在数字时代&#xff0c;则通过精细化数据分析&#xff0c;做出更明智的营销决策…