【OJ】动归练习五之子组串

个人主页 : zxctscl
如有转载请先通知

题目

  • 1. 53. 最大子数组和
    • 1.1 分析
    • 1.2 代码
  • 2. 918. 环形子数组的最大和
    • 2.1 分析
    • 2.2 代码
  • 3. 152. 乘积最大子数组
    • 3.1 分析
    • 3.2 代码
  • 4. 1567. 乘积为正数的最长子数组长度
    • 4.1 分析
    • 4.2 代码

1. 53. 最大子数组和

在这里插入图片描述

1.1 分析

一、题目解析:
求子数组最大和,可能会有所有元素和和子数组所有的和比较,然后取最大的一个。

二、算法原理:

  1. 状态表示
    以i位置为结尾,来求子数组最大和。
    dp[i]:表示以i位置为结尾所有字数组中的最大和

  2. 状态转移方程
    那么dp[i]就可能分两种情况:一种就是只有一个数,就是i对应的nums[i];另一种情况就是不止一个数就是i-1最大的子数组和dp[i-1]加上i位置对应的nums[i]。然后取这两种情况的最大值。
    状态转移方程:dp[i]=max(nums[i],dp[i-1]+nums[i])

  3. 初始化
    第一位置的值可能也会取到,那么就多开一个空间,把dp[0]位置初始化为0,从而不影响后面的最大和。这里同时也要注意下标的映射关系,多开了一个空间,那么对应nums[i]的位置就得向前挪一个。

  4. 填表顺序
    从左往右

  5. 返回值
    就返回dp表中最大的值。
    为了方便,先记录一下当前位置最大子序列和最大值,然后更新。
    在这里插入图片描述

1.2 代码

class Solution {
public:int maxSubArray(vector<int>& nums) {int n=nums.size();vector<int> dp(n+1);dp[0]=0;int ret=INT_MIN;for(int i=1;i<=n;i++){dp[i]=max(nums[i-1],dp[i-1]+nums[i-1]);ret=max(ret,dp[i]);}return ret;}
};

2. 918. 环形子数组的最大和

在这里插入图片描述

2.1 分析

一、题目解析:
这个题与上面一个类似,就是变成了环形。那么这里就可以分为两类:一类是中间相连子数组求最大和;另一类是在结尾和开头求最大和,这里会不方便计算,那么就过来,求中间连续子数组最小和,然后用这个数组的和减去这个最小和,就是这段首尾的最大和。然后比较这两类的和大小,返回最大的那个值就可以了。
在这里插入图片描述

二、算法原理:

  1. 状态表示
    以i位置为结尾,分两种情况:一种来求子数组最大和,一种求最小和
    f[i]:表示以i位置为结尾所有字数组中的最大和
    g[i]:表示以i位置为结尾所有字数组中的最小和

  2. 状态转移方程
    那么f[i]就可能分两种情况:一种就是只有一个数,就是i对应的nums[i];另一种情况就是不止一个数就是i-1最大的子数组和f[i-1]加上i位置对应的nums[i]。然后取这两种情况的最大值。
    f[i]:状态转移方程:f[i]=max(nums[i],f[i-1]+nums[i])

那么g[i]也可能分两种情况:一种就是只有一个数,就是i对应的nums[i];另一种情况就是不止一个数就是i-1最小的子数组和g[i-1]加上i位置对应的nums[i]。然后取这两种情况的最小值。
f[i]:状态转移方程:g[i]=min(nums[i],g[i-1]+nums[i])

  1. 初始化
    第一位置的值可能也会取到,那么就多开一个空间,把f[0]位置和g[0]初始化为0,从而不影响后面的最大和。这里同时也要注意下标的映射关系,多开了一个空间,那么对应nums[i]的位置就得向前挪一个。

  2. 填表顺序
    从左往右

  3. 返回值
    一类是在f表中找到最大值fmax
    一类是在g表中找到最小值gmin
    但是在g表中可能会存在全是负数序列的情况,这里就得加一个判断,如果sum=gmin,那么就返回fmax,不然就比较两类和的大小,返回大的那一个。
    在这里插入图片描述

2.2 代码

class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int n = nums.size();vector<int> f(n+1),g(n+1);int fmax=INT_MIN,sum=0,gmin=INT_MAX;for(int i=1;i<=n;i++){f[i]=max(nums[i-1],f[i-1]+nums[i-1]);fmax=max(fmax,f[i]);g[i]=min(nums[i-1],g[i-1]+nums[i-1]);gmin=min(gmin,g[i]);sum+=nums[i-1];}return sum==gmin?fmax:max(fmax,sum-gmin);}
};

3. 152. 乘积最大子数组

在这里插入图片描述

3.1 分析

一、题目解析:
求子数组最大乘积,可能会有所有元素和和子数组所有的和比较,然后取最大的一个。但是可能会存在i位置小于0,所以的多加一个数组。

二、算法原理:

  1. 状态表示
    以i位置为结尾,来求子数组乘积。
    f[i]:表示以i位置为结尾所有字数组中的最大乘积
    g[i]:表示以i位置为结尾所有字数组中的最小乘积
  2. 状态转移方程
    那么f[i]就可能分两种情况:一种就是只有一个数,就是i对应的nums[i];另一种情况就是不止一个数就是i-1最大的子数组乘积f[i-1]乘i位置对应的nums[i],但是这里的nums[i]可能是小于0,所以这里还得分两种情况:一个是nums[i]>0,那么就是最大的子数组乘积f[i-1]乘i位置对应的nums[i];如果nums[i]<0,就是最小的子数组乘积g[i-1]乘i位置对应的nums[i]。然后取这两种情况的最大值。
    在这里插入图片描述

g[i]就可能分两种情况:一种就是只有一个数,就是i对应的nums[i];另一种情况就是不止一个数就是i-1最小的子数组乘积f[i-1]乘i位置对应的nums[i],但是这里的nums[i]可能是小于0,所以这里还得分两种情况:一个是nums[i]>0,那么就是最小的子数组乘积g[i-1]乘i位置对应的nums[i];如果nums[i]<0,就是最大的子数组乘积g[i-1]乘i位置对应的nums[i]。然后取这两种情况的最小值。
在这里插入图片描述

  1. 初始化
    第一位置的值可能也会取到,那么就多开一个空间,把f[0]位置和g[0]初始化为1,从而不影响后面的最大乘积。这里同时也要注意下标的映射关系,多开了一个空间,那么对应nums[i]的位置就得向前挪一个。

  2. 填表顺序
    从左往右
    两个表一起填

  3. 返回值
    f表里面的最大值
    在这里插入图片描述

3.2 代码

class Solution {
public:int maxProduct(vector<int>& nums) {int n = nums.size();vector<int> f(n+1),g(n+1);f[0]=g[0]=1;int ret=INT_MIN;for(int i=1;i<=n;i++){int x=nums[i-1],y=f[i-1]*nums[i-1],z=g[i-1]*nums[i-1];f[i]=max(x,max(y,z));g[i]=min(x,min(y,z));ret=max(ret,f[i]);}return ret;}
};

4. 1567. 乘积为正数的最长子数组长度

在这里插入图片描述

4.1 分析

一、题目解析:
求数组乘积为正数的最长长度,可能会有所有元素和和子数组所有的和比较,然后取最大的一个。但是可能会存在i位置小于0,所以的多加一个数组。
二、算法原理:

  1. 状态表示
    以i位置为结尾,所有子数组乘积为正数的最长长度。
    f[i]:表示以i位置为结尾所有字数组中乘积为正数的最长长度
    g[i]:表示以i位置为结尾所有字数组中乘积为负数的最长长度

  2. 状态转移方程
    那么f[i]就可能分两种情况:一种就是只有一个数,就是i对应的nums[i],如果num[i]<0,长度就为0,num[i]>0,长度就为1;
    另一种情况就是不止一个数就是i-1最大的子数组乘积为正数的最长长度,如果num[i]>0,长度就为就是以i-1为结尾的子数组乘积为正数的最长长度再加1;num[i]<0,长度就为就是以i-1为结尾的子数组乘积为负数的最长长度再加1,但是如果前面g[i-1]的结果为0,那么结果就是0,所以得先判断g[i-1]是否等于0。
    在这里插入图片描述
    再把这两种情况优化一下,当num[i]>0,那么如果只有num[i]结果就是1,也就是没有不止一个元素的时候大,所以,直接用f[i-1]+1就行。
    num[i]<0,先判断判断g[i-1]是否等于0,是就是0,不是就取g[i-1]+1。
    f的状态转移方程:
    在这里插入图片描述

那么g[i]就可能分两种情况:一种就是只有一个数,就是i对应的nums[i],如果num[i]<0,长度就为1,num[i]>0,长度就为0;
另一种情况就是不止一个数就是i-1最大的子数组乘积为负数的最长长度,如果num[i]>0,长度就为就是以i-1为结尾的子数组乘积为负数的最长长度再加1,也不能直接加一,先判断判断g[i-1]是否等于0,是就是0,不是就取g[i-1]+1;
num[i]<0,长度就为就是以i-1为结尾的子数组乘积为正数的最长长度再加1。
在这里插入图片描述
g的状态转移方程:
在这里插入图片描述

  1. 初始化
    第一位置的值可能也会取到,那么就多开一个空间,把f[0]位置初始化为0,g[0]初始化,0,从而不影响后面的结果。这里同时也要注意下标的映射关系,多开了一个空间,那么对应nums[i]的位置就得向前挪一个。

  2. 填表顺序
    从左往右
    两个表一起填

  3. 返回值
    返回f表里面最大值
    在这里插入图片描述

4.2 代码

class Solution {
public:int getMaxLen(vector<int>& nums) {int n = nums.size();vector<int> f(n+1),g(n+1);int ret=INT_MIN;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;}ret=max(ret,f[i]);}return ret;}
};

有问题请指出,大家有一起进步!!!

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

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

相关文章

密码学基础-对称密码/公钥密码/混合密码系统 详解

密码学基础-对称密码/公钥密码 加解密说明1.加密解密必要因素加密安全性说明 什么是对称密码图示说明对称密码详解什么是DES?举例说明 什么是3DES什么是AES? 公钥密码什么是RSA? 对称密钥和公钥密码优缺点对比对称密码对称密码算法总结对称密码存在的问题? 公钥密码公钥密码…

npm ERR! errno CERT_HAS_EXPIRED

1 问题描述 使用npm命令安装相关依赖报错&#xff1a;npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/vue%2fcli failed, reason: certificate has expired报错示例图如下所示&#xff1a; 2原因分析…

Spring Boot 整合分布式搜索引擎 Elastic Search 实现 自动补全功能

文章目录 ⛄引言一、分词器⛅拼音分词器⚡自定义分词器 二、自动补全查询三、自动补全⌚业务需求⏰实现酒店搜索自动补全 四、效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;…

谈一谈BEV和Transformer在自动驾驶中的应用

谈一谈BEV和Transformer在自动驾驶中的应用 BEV和Transformer都这么火&#xff0c;这次就聊一聊。 结尾有资料连接 一 BEV有什么用 首先&#xff0c;鸟瞰图并不能带来新的功能&#xff0c;对规控也没有什么额外的好处。 从鸟瞰图这个名词就可以看出来&#xff0c;本来摄像头…

阿里云Salesforce CRM功能差异列表 - Winter‘24

阉割版的阿里云Salesforce由于技术和监管等因素与国际版的Salesforce差距很大&#xff01; 一、Winter‘ 24版差异概况&#xff1a; 1.1. 主要版本&#xff1a; 阿里云上的 Salesforce 提供两个版本&#xff0c;用于生产用途的 CN 版本&#xff08;CN Edition&#xff09;和用…

day4 linux上部署第一个nest项目(java转ts全栈/3R教室)

背景&#xff1a;上一篇吧nest-vben-admin项目&#xff0c;再开发环境上跑通了&#xff0c;并且build出来了dist文件&#xff0c;接下来再部署到linux试试吧 dist文件夹是干嘛的&#xff1f; 一个pnpn install 直接生成了两个dist文件夹&#xff0c;前端admin项目一个&#xf…

Jenkins磁盘空间批量清理脚本

一、简介 Jenkins如果没有设置保留构建历史数&#xff0c;磁盘会随着使用次数增加而越来越满&#xff0c;于是需要批量清理一下。 二、清理脚本 找到Script Console 输入脚本&#xff0c;并点击执行&#xff0c;需要注意期望删除的构建历史编号&#xff08;可以查看下面的效果…

14. Springboot集成RabbitMQ

目录 1、前言 2、什么是RabbitMQ 3、安装RabbitMQ 4、Springboot集成RabbitMQ 4.1、添加依赖 4.2、添加配置 4.3、添加controller&#xff0c;作为生产者 4.4、设置生产者消息确认CallBack 4.5、添加Consumer&#xff0c;作为消费者 4.6、启动程序&#xff0c;访问 1…

关键字:this总结

this关键字的使用1. 目前可能出现的问题&#xff1f;及解决方案&#xff1f;我们在声明一个属性对应的setXxx方法时&#xff0c;通过形参给对应的属性赋值。如果形参名和属性名同名了&#xff0c;那么该如何在方法内区分这两个变量呢&#xff1f;解决方案&#xff1a;使用this。…

YOLOv9改进策略 :block优化 | 无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023 RIFormer

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; token mixer被验证能够大幅度提升性能&#xff0c;但典型的token mixer为自注意力机制&#xff0c;推理耗时长&#xff0c;计算代价大&#xff0c;而RIFormers是无需TokenMixer也能达成SOTA性能的极简ViT架构…

java寻找递增子序列(力扣Leetcode491)

寻找递增子序列 力扣原题链接 问题描述 给定一个整数数组 nums&#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序…

Raspberry Pi Pico 可以充当 GPU 吗?

来自 element14 的克莱姆的任务是探索将 Raspberry Pi Pico 转化为 GPU 的可能性&#xff0c;以便在游戏中渲染超级流畅的图形。是的&#xff0c;你没有看错&#xff01;他不是在尝试使用我们的怪物级新 Raspberry Pi 5&#xff0c;甚至不是 Pi 4&#xff0c;他是在尝试使用我们…

数据结构:归并排序

归并排序 时间复杂度O(N*logN) 如果两个序列有序,通过归并,可以让两个序列合并后也有序,变成一个有序的新数组 对于一个数组,如果他的左右区间都有序,就可以进行归并了 归并的方法 将数组的左右两个有序区间比较,每次都取出一个最小的,然后放入临时数组(不能在原数组上修改…

PermissionError: [WinError 5] 拒绝访问。: ‘..\\data‘ 怎么解决

问题 在b站跟着沐神学深度学习&#xff0c;刚开始就遇到问题了&#xff0c;代码如下&#xff1a; import osos.makedirs(os.path.join(..,data),exist_okTrue) data_fileos.path.join(..,data,house_tiny.csv) with open(data_file,w) as f:f.write(NumRooms,Alley,Price\n)f…

空间数据结构(四叉树,八叉树,BVH树,BSP树,K-d树)

下文参考&#xff1a;https://www.cnblogs.com/KillerAery/p/10878367.html 游戏编程知识课程 - 四分树(quadtree)_哔哩哔哩_bilibili 利用空间数据结构可以加速计算&#xff0c;是重要的优化思想。空间数据结构常用于场景管理&#xff0c;渲染&#xff0c;物理&#xff0c;…

【过度拟合?秒了!】

目录 引言 一、简化模型复杂度 1 .1 特征选择 1.2 降低多项式阶数 1.3 减少神经元数量或层数 二、使用正则化技术 2.1 L1正则化&#xff08;Lasso&#xff09; 工作原理 应用场景 2.2 L2正则化&#xff08;Ridge&#xff09; 2.3 Elastic Net正则化 2.4 代码事例 …

国内如何购买midjourney?midjourney购买教程?midjourney注册方式?

1. Midjourney介绍 Midjourney 是一款备受欢迎的人工智能生成图像工具&#xff0c;它可以通过输入文字描述&#xff0c;自动生成精美的图像。与许多其他图像生成工具不同&#xff0c;Midjourney 不需要安装任何软件&#xff0c;也不受个人电脑性能的限制&#xff0c;因为它运行…

【测试篇】测试眼里的 BUG

文章目录 如何描述一个bug如何定义 bug 的级别BUG 的生命周期跟开发起争执怎么办&#xff08;高频面试题&#xff09; 如何描述一个bug 一个合格的bug描述应该包含以下几个部分&#xff1a; 发现问题的版本问题出现的环境错误重现的步骤预期行为的描述错误行为的描述其他&…

USB-PD

这是目录 写在前面1、概览2、信息2.1 消息结构2.1.1 消息头 3、soft or hard reset1、soft reset2、hard reset 3、TYPE-C相关握手3.1、CC线的状态3.1.1、默认电源值3.2 TYPE-C设备握手协商过程确定握手类型DRP和DRP设备握手 写在前面 1、记录自己的学习PD协议层的文章 1、概…

消息队列经典应用场景

笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。 在职业生涯中,笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章,笔者结合自己的真实经历,和大家分享消息队列的七种经典应用场景。 1 异步&解耦 笔者曾经负责某电…