子数组问题

目录

最大子数组和

环形子数组的最大和

乘积最大子数组

乘数为正数的最长子数组长度

等差数列划分

最长湍流子数组

单词拆分

环绕字符串中唯一的子字符串


声明:接下来主要使用动态规划来解决问题!!!

最大子数组和

题目

思路

解决子数组问题,在接下来将屡试不爽的采用“以某个位置为结尾”来分析问题。

状态表示:dp[i]表示以i位置为结尾的最大子数组和。

我们可以将上面很多情况分为两类:i单独为数组;i和前面的元素一起组成数组。

状态转移方程:dp[i]=max(nums[i],dp[i-1]+nums[i])

初始化:dp[0]=nums[0]。

填表顺序:从左往右。

返回值:dp表的最大值。

代码

class Solution {
public:int maxSubArray(vector<int>& nums) {int n=nums.size();vector<int> dp(n+1);for(int i=1;i<=n;i++)dp[i]=max(nums[i-1],dp[i-1]+nums[i-1]);return *max_element(dp.begin()+1,dp.end());    }
};
环形子数组的最大和

题目

思路

本道题差别于上一道题的地方在于,数组是环形的,这样的话,在屡试不爽的采用“以i位置为结尾”来分析问题时,还需要通过%模运算,有点麻烦。

通过分析不难发现,环形子数组的最大和只有两种情况:

其一是最大子数组在数组中间,其二是最大子数组在头和尾。

通过上图不难发现,第一种情况可以采用求“最大子数组”的方式,由于数组的总和是确定的,那么第二种情况可以采用求“最小子数组”的方式。

状态表示:f[i]表示以i位置为结尾的最大子数组的和;

                  g[i]表示以i位置为结尾的最小子数组的和。

状态转移方程:f[i]=max(nums[i],f[i-1]+nums[i])

                         g[i]=min(nums[i],g[i-1]+nums[i])

初始化:不用初始化。

填表顺序:从左往右。

返回值:如果sum=gmin,返回fmax;否则,返回max(fmax,sum-gmin)。

代码

class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int n=nums.size();vector<int> f(n+1);vector<int> g(n+1);int sum=0;for(int x:nums)sum+=x;for(int i=1;i<=n;i++){f[i]=max(nums[i-1],f[i-1]+nums[i-1]);g[i]=min(nums[i-1],g[i-1]+nums[i-1]);}int fmax=*max_element(f.begin()+1,f.end());int gmin=*min_element(g.begin()+1,g.end());if(gmin==sum) return fmax;else return max(fmax,sum-gmin);}
};
乘积最大子数组

题目

思路

解决子数组问题,依旧屡试不爽的采用“以某个位置为结尾”来分析问题。

状态表示:f[i]表示以i位置为结尾的最大子数组和;

                  g[i]表示以i位置为结尾的最小子数组和。

我们可以将上面很多情况分为两类:i单独为数组;i和前面的元素一起组成数组(又分为nums[i]>0  和 nums[i]<0)。

状态转移方程:

初始化:f[0]=g[0]=0

填表顺序:从左往右

返回值:f表最大值。

代码

class Solution {
public:int maxProduct(vector<int>& nums) {int n=nums.size();vector<int> f(n+1);vector<int> g(n+1);f[0]=g[0]=1;for(int i=1;i<=n;i++){f[i]=max(nums[i-1],max(f[i-1]*nums[i-1],g[i-1]*nums[i-1]));g[i]=min(nums[i-1],min(g[i-1]*nums[i-1],f[i-1]*nums[i-1]));}return *max_element(f.begin()+1,f.end());}
};
乘数为正数的最长子数组长度

题目

思路

解决子数组问题,依旧屡试不爽的采用“以某个位置为结尾”来分析问题。

状态表示:f[i]表示以i位置为结尾乘积为正数的最长子数组的长度;

                  g[i]表示以i位置为结尾乘积为负数的最长子数组的长度。

我们可以将上面很多情况分为两类:i单独为数组(又分为nums[i]>0  和 nums[i]<0);i和前面的元素一起组成数组(又分为nums[i]>0  和 nums[i]<0)。

状态转移方程:

初始化:不用初始化

填表顺序:从左往右。

返回值:f表最大值。

代码

class Solution {
public:int getMaxLen(vector<int>& nums) {int n=nums.size();vector<int> f(n+1);vector<int> g(n+1);for(int i=1;i<=n;i++){if(nums[i-1]>0){f[i]=f[i-1]+1;g[i]=g[i-1]==0?0:g[i-1]+1;}else if(nums[i-1]<0){f[i]=g[i-1]==0?0:g[i-1]+1;g[i]=f[i-1]+1;}}return *max_element(f.begin()+1,f.end());}
};
等差数列划分

题目

思路

解决子数组问题,依旧屡试不爽的采用“以某个位置为结尾”来分析问题。

状态表示:dp[i]表示以i位置元素为结尾的等差数列的个数。

状态转移方程:if(nums[i-2]+nums[i]==2*nums[i-1])

                                  dp[i]=dp[i-1]+1;

初始化:不用初始化

填表顺序:从左往右。

返回值:dp表元素之和。

代码

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n=nums.size();if(n<3) return 0;vector<int> dp(n);for(int i=2;i<n;i++){if(nums[i-2]+nums[i]==2*nums[i-1])dp[i]=dp[i-1]+1;}int ret=0;for(int k:dp)ret+=k;return ret;}
};
最长湍流子数组

题目

思路

解决子数组问题,依旧屡试不爽的采用“以某个位置为结尾”来分析问题。

状态表示:f[i]表示以i位置元素为结尾,呈“上升”趋势的湍流子数组的长度;

                  g[i]表示以i位置元素为结尾,呈“下降”趋势的湍流子数组的长度。

状态转移方程:

初始化:全都初始化为1.

返回值:两个表的最大值。

代码

class Solution {
public:int maxTurbulenceSize(vector<int>& arr) {int n=arr.size();vector<int> f(n,1);vector<int> g(n,1);for(int i=1;i<n;i++){if(arr[i]>arr[i-1]) g[i]=f[i-1]+1;else if(arr[i]<arr[i-1]) f[i]=g[i-1]+1; }int a=*max_element(f.begin(),f.end());int b=*max_element(g.begin(),g.end());return max(a,b);}
};
单词拆分

题目

思路

解决子数组问题,依旧屡试不爽的采用“以某个位置为结尾”来分析问题。

状态表示:dp[i]表示s字符串[0,i]区间内的子字符串可以拆分出在字典中出现的单词。

状态转移方程:dp[i]=dp[j-1]==true && s的[j,i]区间字符串有在字典中出现。【0<=j<i】

初始化:dp[0]=true

填表顺序:从左往右。

返回值:dp[n].

代码

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> hash;for(string str:wordDict)hash.insert(str);int n=s.size();s=' '+s;vector<bool> dp(n+1);dp[0]=true;for(int i=1;i<=n;i++){for(int j=i;j>=1;j--){if(dp[j-1] && hash.count(s.substr(j,i-j+1))){dp[i]=true;break;}}}return dp[n];}
};
环绕字符串中唯一的子字符串

题目

思路

我们依旧屡试不爽的采用“以某个位置为结尾”来分析问题。

状态表示:dp[i]表示以i位置元素为结尾的子字符串在base中出现的次数。

状态转移方程:

            if(s[i-1]+1==s[i] || (s[i-1]=='z' && s[i]=='a'))

                dp[i]+=dp[i-1];

初始化:全都初始化为1.

返回值:由于题目中要求统计并返回 s 中有多少 不同非空子串 也在 base 中出现,因此我们需要做“去重”操作,对于两个相同字符,只需统计以该字符结尾在base中出现次数最多的那个即可,然后返回去重后的总和。

代码

class Solution {
public:int findSubstringInWraproundString(string s) {int n=s.size();vector<int> dp(n,1);for(int i=1;i<n;i++)if(s[i-1]+1==s[i] || (s[i-1]=='z' && s[i]=='a'))dp[i]+=dp[i-1];int arr[26];for(int i=0;i<n;i++){arr[s[i]-97]=max(arr[s[i]-97],dp[i]);}int ret=0;for(int i=0;i<26;i++)ret+=arr[i];return ret;}
};

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

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

相关文章

优化理论——迭代方法

线性回归建模 训练&#xff0c;预测 { ( x ( i ) , y ( i ) ) } \{(x^{(i)},y^{(i)})\} {(x(i),y(i))} ⼀个训练样本&#xff0c; { ( x ( i ) , y ( i ) ) ; i 1 , ⋯ , N } \{(x^{(i)},y^{(i)});i1,\cdots ,N\} {(x(i),y(i));i1,⋯,N} 训练样本集 { ( x 1 ( i ) , x 2 ( i…

Linux 扩展硬盘容量

根分区的硬盘容量不够了需要添加容量 扩展硬盘容量前提是需要虚拟机关机才能进行以下操作 在虚拟中找到虚拟机设置 >> 点击硬盘 >> 选择扩展 >> 输入自已要扩展的大小 >> 确定 这些设置好之后&#xff0c;启动虚拟机 fdisk /dev/sda n p 三个回车…

09、java程序流程控制之一:顺序结构、分支语句(if-else结构)(经典案例以及Scanner类的使用)

java程序流程控制之一&#xff1a; Ⅰ、顺序结构&#xff1a;1、顺序结构简介&#xff1a; Ⅱ、分支语句&#xff1a;if-else1、if-else分支结构&#xff1a;其一、描述&#xff1a;其二、代码为&#xff1a;其三、截图为&#xff1a; 2、如何从键盘获取不同类型的变量&#xf…

Mac Dock栏多屏幕漂移固定的方式

记录一下 我目前的版本是 14.5 多个屏幕&#xff0c;Dock栏切换的方式&#xff1a; 把鼠标移动到屏幕的中间的下方区域&#xff0c;触到边边之后&#xff0c;继续往下移&#xff0c;就能把Dock栏固定到当前屏幕了。

pytorch 是如何调用 cusolver API 的调用

0&#xff0c;环境 ubuntu 22.04 pytorch 2.3.1 x86 RTX 3080 cuda 12.2 1, 示例代码 以potrs为例&#xff1b; hello_cholesk.py """ hello_cholesky.py step1, Cholesky decompose; step2, inverse A; step3, Cholesky again; python3 hello_cholesky.py -…

【Hot100】LeetCode—155. 最小栈

目录 题目1- 思路2- 实现⭐155. 最小栈——题解思路 3- ACM 实现 题目 原题连接&#xff1a;155. 最小栈 1- 思路 思路 最小栈 ——> 借助两个栈来实现 2- 实现 ⭐155. 最小栈——题解思路 class MinStack {Stack<Integer> data;Stack<Integer> min;public …

JVM系列 | 对象的创建与存储

JVM系列 | 对象的生命周期1 对象的创建与存储 文章目录 前言对象的创建过程内存空间的分配方式方式1 | 指针碰撞方式2 | 空闲列表 线程安全问题 | 避免空间冲突的方式方式1 | 同步处理&#xff08;加锁)方式2 | 本地线程分配缓存 对象的内存布局Part1 | 对象头Mark Word类型指针…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 游乐园门票 (200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 最新华为O…

SqlServer SQL语句或存储过程运行慢 使用 WITH RECOMP ILE 或 OPTION (RECOMPILE)(重新编译)

如果您的存储过程包含参数可以重新申明变量把参数接收下&#xff0c;可能解决你过程执行慢的原因。如果未能解决&#xff0c;请参考以下文章内容&#xff1a; WITH RECOMPILE 子句可以在以下地方使用&#xff1a; 一种是当你创建一个过程时&#xff0c;例如&#xff1a; CREA…

Linux离线安装Mysql5.7

Linux之Mysql安装配置 第一种&#xff1a;Linux离线安装Mysql&#xff08;提前手动下载好tar.gz包&#xff09; 第二种&#xff1a;通过yum安装配置Mysql&#xff08;服务器有网络&#xff09; 之前在阿里云上采用yum安装过一次&#xff08;请看这里&#xff09;&#xff0c;…

基于SpringBoot+VueJS+微信小程序技术的图书森林共享小程序设计与实现

注&#xff1a;每个学校每个老师对论文的格式要求不一样&#xff0c;故本论文只供参考&#xff0c;本论文页数达到60页以上&#xff0c;字数在6000及以上。 基于SpringBootVueJS微信小程序技术的图书森林共享小程序设计与实现 目录 基于SpringBootVueJS微信小程序技术的图书森…

27.数码管的驱动,使用74HC595移位寄存器芯片

PS&#xff1a;升腾A7pro系列FPGA没有数码管外设&#xff0c;因此以AC620FPGA为例展开实验。 &#xff08;1&#xff09;共阳极数码管和共阴极数码管示意图&#xff1a; AC620中的数码管属于共阳极数码管&#xff0c;段选端口(dp,g,f,e,d,c,b,a)低电平即可点亮led。人眼的视觉…

连锁直营店小程序赋能多店如何管理

如商超便利店卖货线下场景&#xff0c;也有不少品牌以同城多店和多地开店经营为主&#xff0c;获取店铺周围客户和散流&#xff0c;如今线上重要性凸显&#xff0c;品牌电商发展是经营的重要方式之一&#xff0c;也是完善同城和外地客户随时便捷消费的方式之一。 多个门店管理…

抖音视频图文根据ID获得评论信息网站源码

抖音视频图文根据ID获得评论信息单页源码&#xff0c;id是视频的id&#xff0c;可以自定义第几条评论开始&#xff0c;不填默认为0&#xff0c;评论数量最大数量50&#xff0c;默认是20。 接口返回参数&#xff1a; "comments": 评论信息集合 { "uid": 评…

原创音乐小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;歌曲类型管理&#xff0c;歌曲信息管理&#xff0c;热门歌手管理&#xff0c;音乐资讯管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;歌曲信息&a…

数学建模·Topsis优劣解距离法

Topsis优劣解 一种新的评价方法&#xff0c;特点就是利用原有数据&#xff0c;客观性强。 相较于模糊评价和层次评价 更加客观&#xff0c;充分利用原有数据&#xff0c;精确反映方案差距 基本原理 离最优解最近&#xff0c;离最劣解越远 具体步骤 正向化 代码与原理与熵权…

链接追踪系列-08.mac m1安装logstash-番外

下载地址&#xff1a;https://elasticsearch.cn/download/ 配置es相关&#xff1a; #安装plugin&#xff1a; jelexbogon bin % ./logstash-plugin install logstash-codec-json_lines启动&#xff1a;指定配置文件运行 jelexbogon bin % nohup ./logstash -f ../config…

leetcode 513. 找树左下角的值

给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二叉树的节点个数的范围是 [1,104]-231 < Node.val &…

张雪峰高考志愿填报

描述 张雪峰&#xff0c;一个富有才华的老师&#xff01; 对于大家的学习有不可多得的帮助。 内容 目前主要的内容以自愿填报为主&#xff0c;对于学习自愿填报有比较大的帮助&#xff01; 但是网络上面错综复杂&#xff0c;很多老旧的版本影响学习&#xff01; 而这里我整…

vue3 快速入门 (一) : 环境配置与搭建

1. 本文环境 Vue版本 : 3.4.29Node.js版本 : v20.15.0系统 : Windows11 64位IDE : VsCode 2. 安装Node.Js 首先&#xff0c;我们需要安装Node.Js。Node.js提供了运行 JavaScript 代码的环境。并且Node.js 带来了 npm&#xff0c;它是JavaScript世界的包管理工具。开发vue时&…