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…

对有状态组件和无状态组件的理解及使用场景

&#xff08;1&#xff09;有状态组件 特点&#xff1a; ● 是类组件 ● 有继承 ● 可以使用this ● 可以使用react的生命周期 ● 使用较多&#xff0c;容易频繁触发生命周期钩子函数&#xff0c;影响性能 ● 内部使用 state&#xff0c;维护自身状态的变化&#xff0c;有状态组…

【C++】函数重载

C 中的函数重载&#xff08;Function Overloading&#xff09;是指在同一个作用域内&#xff0c;可以定义多个名称相同但参数列表不同的函数。通过函数重载&#xff0c;可以根据传递给函数的参数类型或数量的不同&#xff0c;选择适当的函数来执行。 函数重载的条件 C 函数重…

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…

信号量、互斥锁并发机制

区分&#xff1a; 信号&#xff1a;通讯机制 信号量&#xff1a;并发控制 一、信号量&#xff1a;基于阻塞的并发控制机制 a.定义信号量 struct semaphore sem; b.初始化信号量 void sema_init(struct semaphore *sem, int val); c.获得信号量P操作 int down(struct semap…

内网穿透的应用-如何使用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…

QT中QApplication对象有且只有一个

QT中QApplication对象有且只有一个 QApplication对象 QApplication对象 QApplication是应用程序对象 #include <QApplication> int main(int argc,char* argv[]); {//a对象在一个程序中有且只有一个&#xff0c;QT中要求必须有一个QApplication a&#xff08;argc,argv…

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…

Android studio 之 弹窗PopupWindow

1.准备弹窗视图 popuop_layout.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"horizontal"android:background"#00ffff&…

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;如何…

Java 8的新特性简单分享(后续有系列篇~敬请期待)

Java 8的新特性分享 Java 8是Java语言迎来的一次革命性的更新&#xff0c;引入了众多强大的新特性&#xff0c;使得Java开发变得更加现代化和便捷。在这篇博客中&#xff0c;我们将深入探讨Java 8的一些主要特性&#xff0c;并通过丰富的案例演示展示它们的用法。 1. Lambda表…