【动态规划专栏】专题四:子数组问题--------最大子数组和环形子数组的最大和

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:动态规划专栏
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

专题一

  • 题目一来源
  • 题目一描述
  • 算法原理
    • 1.状态表示
    • 2.状态转移方程
    • 3.初始化
    • 4.填表顺序
    • 5.返回值
  • 代码实现
  • 题目二来源
  • 题目二描述
  • 算法原理
    • 1.状态表示
    • 2.状态转移方程
    • 3.初始化
    • 4.填表顺序
    • 5.返回值
  • 代码实现

题目一来源

本题来源为:

Leetcode152. 乘积最大子数组

题目一描述

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

子数组 是数组的连续子序列。
在这里插入图片描述

算法原理

1.状态表示

经验+题目要求
在这里插入图片描述

在这里插入图片描述

对于本题而言就是:

f[i]表示:以i位置为结尾时的所有子数组中的最大乘积
g[i]表示:以i位置为结尾时的所有子数组中的最小乘积

2.状态转移方程

在这里插入图片描述
在这里插入图片描述

因此状态方程为:

int x=nums[i-1];
int y=f[i-1] * nums[i-1];
int 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]);

3.初始化

在这里插入图片描述

4.填表顺序

从左往右,两个表一起填

5.返回值

f表里的最大值

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution 
{
public:int maxProduct(vector<int>& nums) {//创建dp表int n=nums.size();vector<int> f(n+1);vector<int> g(n+1);//初始化f[0]=g[0]=1;//填表int ret=INT_MIN;for(int i=1;i<=n;i++){int x=nums[i-1];int y=f[i-1] * nums[i-1];int 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;}
};

题目二来源

本题来源为:

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

题目二描述

给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。

一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。

请你返回乘积为正数的最长子数组长度。

在这里插入图片描述

算法原理

1.状态表示

经验+题目要求
在这里插入图片描述

对于本题而言就是:

f[i]表示:以i位置为结尾时的所有子数组中的乘积为正数的最长长度
g[i]表示:以i位置为结尾时的所有子数组中的乘积负数的最长长度

2.状态转移方程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

因此状态方程为:

  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]);

3.初始化

在这里插入图片描述

4.填表顺序

从左往右,两个表一起填

5.返回值

f表里面的最大值

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution 
{
public:int getMaxLen(vector<int>& nums) {int n=nums.size();//创建dp表vector<int> f(n+1);vector<int> 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.hqwc.cn/news/484918.html

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

相关文章

现货黄金中短线投资该怎么做?

要明确什么是现货黄金的中短线投资&#xff0c;中短线投资是指在短期内&#xff08;一般为几天至几周&#xff09;对现货黄金进行买卖操作&#xff0c;以期获得收益的投资方式。相较于长线投资&#xff0c;中短线投资的风险相对较大&#xff0c;但同时收益也更为可观。那么&…

【TCP/IP】内核网络堆栈

在Linux内核中&#xff0c;网络堆栈&#xff08;network stack&#xff09;是一套实现网络通信功能的软件包&#xff0c;负责处理数据包的发送和接收。网络堆栈按照OSI模型&#xff08;开放式系统互联通信参考模型&#xff09;或TCP/IP模型的层次结构来组织&#xff0c;实现了从…

数据结构2.22

思维导图顺序表(按位置插入、按位置删除和去重) //main.c #include "seq_list.h" int main() {seq_p L create_seq_list();insert_head(L,23);insert_head(L,20);insert_head(L,9);insert_head(L,20);insert_head(L,20);insert_head(L,6);insert_pos(L,321,2);inser…

2024牛客寒假算法基础集训营3 -BDGH

B题 &#xff1a;智乃的数字手串 思路&#xff1a; 思维题&#xff0c;本题题意N个数组首尾相连&#xff0c;然后当某两个相邻数组和为偶数时&#xff0c;交替拿走&#xff0c;并在选择两个数字交换位置&#xff0c;直到没有可以操作的数字为止。 我们可以考虑&#xff0c;数字…

016—pandas 分析近100年圣诞节日期分布

需求&#xff1a; 利用Pandas 分析近100年圣诞节的星期分布&#xff0c;目的是知道圣诞节都在星期几&#xff0c;哪个星期多些。 思路&#xff1a; 用 pd.date_range 生成 100 年日期数据 筛选出12月25日的所有日期 将日期转换为星期几 统计重复值的数量 绘图 二、…

LeetCode 热题 100 Day01

哈希模块 哈希结构&#xff1a; 哈希结构&#xff0c;即hash table&#xff0c;哈希表|散列表结构。 图摘自《代码随想录》 哈希表本质上表示的元素和索引的一种映射关系。 若查找某个数组中第n个元素&#xff0c;有两种方法&#xff1a; 1.从头遍历&#xff0c;复杂度&#xf…

快速鲁棒的ICP(一)

一、代码下载以、修改以及使用 链接&#xff1a;OpenGP/sparseicp: Automatically exported from code.google.com/p/sparseicp (github.com) 解压之后&#xff1a; 快速鲁棒的ICP是其他人在这份Sparse ICP代码基础上改写出来的&#xff1a; 我这里已经下载好了&#xff1a;…

代码随想录算法训练营day19||二叉树part06、654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

654.最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums …

《VitePress 简易速速上手小册》第7章 高级功能与动态内容(2024 最新版)

文章目录 7.1 动态路由与 API 集成7.1.1 基础知识点解析7.1.2 重点案例&#xff1a;技术博客7.1.3 拓展案例 1&#xff1a;电商网站7.1.4 拓展案例 2&#xff1a;事件管理网站 7.2 状态管理与 Vuex 使用7.2.1 基础知识点解析7.2.2 重点案例&#xff1a;用户认证系统7.2.3 拓展案…

IEEE802.11k协议介绍

IEEE802.11k协议简介 协议全称&#xff1a;无线局域网的无线电资源测量(Radio Resource Measurement of Wireless LANs)批准日期&#xff1a;2008年5月协议状态&#xff1a;并入802.11-2012协议别名&#xff1a;辅助漫游协议说明&#xff1a; 定义了接入点(AP)和终端(STA&…

机器人内部传感器阅读笔记及心得-位置传感器-旋转变压器、激光干涉式编码器

旋转变压器 旋转变压器是一种输出电压随转角变化的检测装置&#xff0c;是用来检测角位移的&#xff0c;其基本结构与交流绕线式异步电动机相似&#xff0c;由定子和转子组成。 旋转变压器的原理如图1所示&#xff0c;定子相当于变压器的一次侧&#xff0c;有两组在空间位置上…

【测试】----JMeter性能测试工具入门篇

定义&#xff08;主要测试的是接口&#xff09; JMeter是Apache组织使用Java开发的一款测试工具&#xff0c;可以对服务器&#xff0c;网络或者对象模拟巨大的负载情况&#xff1b;通过创建带有断言的脚本来验证程序是否能返回期望的结果 优缺点 优点 开源免费跨平台&#xff0…