【动态规划】子数组、子串系列I|最大子数组和|环形子数组的最大和|乘积最大子数组|乘积为正数的最长子数组长度

一、最大子数组和

最大子数组和

算法原理: 

 💡细节:

1.返回值为dp表每个位置的最大值,而不是只看最后一个位置,因为可能最后一个位置都不选 

2.可以直接在填dp表的时候就进行返回值的比较

3.如果初始化选择多开一个位置,那么就需要注意下标的映射

class Solution {public int maxSubArray(int[] nums) {int n = nums.length;int[] dp = new int[n+1];//dp表示以i位置为结尾的所有子数组中的最大和int ret = Integer.MIN_VALUE;for(int i=1;i<n+1;i++) {dp[i] = Math.max(nums[i-1],dp[i-1]+nums[i-1]);//注意下标映射ret = Math.max(ret,dp[i]);}return ret;}
}

二、环形子数组的最大和

918. 环形子数组的最大和

算法原理

 💡细节: 

1.因为是环形的,我们就跟上次打家劫舍II一样的思路,进行拆分分类讨论,分为(1)结果就在数组中间,跟上题一样,(2)结果在两边,这个时候求最大,那么反向思考,就考虑中间区间最小,进一步转化为(1)

2.返回值:注意当nums数组中元素全为负数时,那么sum-gmin为0,而根据题意,此时的返回值只能为负数,那么就需要特殊考虑这种情况

class Solution {public int maxSubarraySumCircular(int[] nums) {int n = nums.length;int[] f = new int[n+1];//结果在中间:求以i位置为结果的所有子数组的最大值int[] g = new int[n+1];//结果在两边:求以i位置为结果的所有子数组的最小值int fmax = Integer.MIN_VALUE;int gmin = Integer.MAX_VALUE;int sum = 0;for(int i=1;i<n+1;i++) {int x = nums[i-1];sum += x;f[i] = Math.max(x,f[i-1]+x);fmax = Math.max(fmax,f[i]);g[i] = Math.min(x,g[i-1]+x);gmin = Math.min(gmin,g[i]);}return sum==gmin?fmax:Math.max(fmax,sum-gmin);}
}

三、乘积最大子数组

152. 乘积最大子数组

算法原理

💡细节: 

1.如果只用一个f表时,在分类讨论的时候会发现当nums[i]为负数的时候,f[i-1]*nums[i]也为负,那么就不可能是最大乘积,所以还需要一个g表来表示最小乘积,同时填g表的时候跟f表一样的考虑(考虑nums[i]是正负+长度为1三种情况

2.初始化的时候注意是乘法,f[0]和g[0]都应该初始化为1

class Solution {public int maxProduct(int[] nums) {int n = nums.length;int[] f = new int[n+1];//以i位置为结果的所有子数组的最大乘积int[] g = new int[n+1];//以i位置为结果的所有子数组的最小乘积f[0] = g[0] = 1;int ret = Integer.MIN_VALUE;for(int i=1;i<n+1;i++) {int x = nums[i-1],y = f[i-1]*nums[i-1],z = g[i-1]*nums[i-1] ;f[i] = Math.max(x,Math.max(y,z));g[i] = Math.min(x,Math.min(y,z));ret = Math.max(ret,f[i]);}return ret;}
}

四、乘积为正数的最长子数组长度

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

算法原理

💡细节: 

1.本题跟上题一样,一个f表无法解决问题,需要一个g表来辅助

2.(1)在分析f表的状态方程时,长度大于1且nums[i]<0的情况下:要判断g[i-1](即最长的负数乘积长度)是否存在的情况,不存在就为0,存在才是g[i-1]+1;在分析g表的状态方程时,长度大于1且nums[i]>0的情况同理

(2)分析完f表和g表可以进行合并,直接分为nums[i]大于0和小于0的情况即可

3.初始化:根据上面的状态表示f[0]和g[0]全部初始化为0即可

class Solution {public int getMaxLen(int[] nums) {int n = nums.length;int[] f = new int[n+1];int[] g = new int[n+1];int ret = Integer.MIN_VALUE;for(int i=1;i<n+1;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 = Math.max(ret,f[i]);}return ret;}
}

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

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

相关文章

2024最新版JavaScript逆向爬虫教程-------基础篇之无限debugger的原理与绕过

目录 一、无限debugger的原理与绕过1.1 案例介绍1.2 实现原理1.3 绕过debugger方法1.3.1 禁用所有断点1.3.2 禁用局部断点1.3.3 替换文件1.3.4 函数置空与hook 二、补充2.1 改写JavaScript文件2.2 浏览器开发者工具中出现的VM开头的JS文件是什么&#xff1f; 一、无限debugger的…

520送男士内裤给男朋友好吗?五大男士内裤测评种草

相信有很多朋友都选在520这个特殊的日子里为心爱的人挑选一份特别的礼物吧&#xff01;如果送礼给男朋友或老公&#xff0c;一份实用的礼物肯定是最佳选择哦&#xff01;很多男性朋友每条内裤都穿很久&#xff0c;如果给男朋友挑选合适的男士内裤&#xff0c;也是一种关心体贴的…

Spring中的StreamUtils:流式处理利器

1. 概述 StreamUtils是Spring框架提供的一个工具类&#xff0c;它专注于简化对输入流&#xff08;InputStream&#xff09;和输出流&#xff08;OutputStream&#xff09;的操作。在Java编程中&#xff0c;流的处理经常涉及到缓冲、读取、写入等操作&#xff0c;StreamUtils封…

编程技巧练习

1、数字编写 a1_0000_0000#在其位上的数&#xff0c;20&#xff0c;个十&#xff0c;读数&#xff1a;二十。a1000000001_0000_00002、交换数值 a1 b2 a,bb,a a,b(2, 1)3、范围判断 x98 if 90<x<100:print(Y)Y4、快速构建字符串 print(-*60)------------------------…

[华为OD]BFS C卷 200 智能驾驶

题目&#xff1a; 有一辆汽车需要从m*n的地图的左上角(起点)开往地图的右下角(终点)&#xff0c;去往每一个地区都需 要消耗一定的油量&#xff0c;加油站可进行加油 请你计算汽车确保从起点到达终点时所需的最少初始油量说明&#xff1a; (1)智能汽车可以上下左右四个方向…

C++ 复习2 输入输出 基本数据类型

输入输出 标准输出流 ( cout ) cout 代表标准输出流&#xff0c;通常用于向屏幕输出数据。 使用操作符 << &#xff08;插入操作符&#xff09;向 cout 发送数据。 例如&#xff0c; std::cout << "Hello, world!" << std::endl; 会在屏幕上打印 …

linux 安装msyh.ttc字库

首先&#xff0c;你需要确保已经下载了msyh.ttc文件。如果你已经有了这个文件&#xff0c;跳过这一步。否则&#xff0c;你可以从微软官网或其他可信来源获取它。 打开终端&#xff0c;创建一个新的字体目录&#xff08;如果还没有的话&#xff09;&#xff1a; sudo mkdir /…

本地搭建AI环境

本地搭建AI 这几天刚刚看到好兄弟分享的一段关于本地搭建AI的短视频&#xff0c;于是我按照视频里的讲解&#xff0c;进行了实践。感觉非常棒&#xff01;&#xff01;&#xff0c;马上整理成文字与大家分享一下。 在本地启动并运行大型语言模型&#xff0c;运行llama3、phi3…

自然语言处理(NLP)技术有哪些运用?

目录 一、自然语言处理&#xff08;NLP&#xff09;技术有哪些运用&#xff1f; 二、Python进行文本的情感分析 1、NLTK库: 2、TextBlob库: 三、错误排除 一、自然语言处理&#xff08;NLP&#xff09;技术有哪些运用&#xff1f; 自然语言处理&#xff08;NLP&#xff09…

区块链 | NFT 水印:Review on Watermarking Techniques(一)

&#x1f34d;原文&#xff1a;Review on Watermarking Techniques Aiming Authentication of Digital Image Artistic Works Minted as NFTs into Blockchains 1 应用于 NFT 的水印技术 常见的水印技术类型可以分为&#xff1a; 可见 v i s i b l e \mathsf{visible} visi…

【算法刷题day48】Leetcode:121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II

文章目录 Leetcode 121. 买卖股票的最佳时机解题思路代码总结 Leetcode 122. 买卖股票的最佳时机 II解题思路代码总结 草稿图网站 java的Deque Leetcode 121. 买卖股票的最佳时机 题目&#xff1a;121. 买卖股票的最佳时机 解析&#xff1a;代码随想录解析 解题思路 二维dp数…

多线程、mutex互斥量

目录 多线程数据共享问题 互斥量 lock()和unlock() std::lock_guard 死锁 std::lock() std::lock_guard()的std::adopt_lock参数 多线程数据共享问题 同一个进程中多个线程之间可以共享一部分资源数据。这些对多个线程都大开后门的数据&#xff0c;有些时常会被各个个线…

学习Uni-app开发小程序Day5

今天根据老师视频学习了几个vue的功能 v-bind指令配合图片轮播–class和style内联绑定 这是在vue中的指令方式&#xff0c;在attribute 中需要用到这个&#xff0c;简写的话就是直接冒号&#xff0c;例如&#xff1a; :class,这里有个区别&#xff0c;组件加上class&#xff0…

循环神经网络(RNN)

大家好&#xff0c;这里是七七&#xff0c;这两天在写关于神经网络相关的知识&#xff0c;面对的是有一定基础的读者哦。 一、RNN核心思想 RNN的核心思想就是曾经的输入造成的影响&#xff0c;会以致影响之后的输入&#xff0c;即隐含层的输出取决于历史数据的全部输入。 三个…

Infuse for Mac激活版:高清影音播放软件

对于热爱影音娱乐的Mac用户来说&#xff0c;Infuse for Mac是一个不容错过的选择。它以其简洁的操作界面和强大的播放功能&#xff0c;为用户带来了全新的影音播放体验。 Infuse for Mac支持广泛的音视频格式&#xff0c;无需额外转换&#xff0c;即可轻松播放您喜爱的影片。无…

深入理解Spring AOP中多切面拦截与异常处理

Spring AOP&#xff08;Aspect-Oriented Programming&#xff09;使得切面的编程成为了Java开发的一部分&#xff0c;它通过在运行时将额外的逻辑添加到特定的方法或类上&#xff0c;来提供横切关注点的解决方案&#xff0c;比如日志、事务处理以及安全控制等。但随着切面的使用…

MySql中什么是回表? 如何减少回表的次数

背景 在InnerDB中&#xff0c; B数的叶子节点存储数据的索引是聚集索引&#xff0c;也就是我们说的主键索引&#xff0c;而B数的叶子节点存储主键索引的是非聚集索引&#xff0c;也就是其他的索引 普通索引 唯一索引 组合索引&#xff0c;也就是非主键索引&#xff0c;在InnerD…

澳大利亚公司注册

澳大利亚是一个高度发达的资本主义国家&#xff0c;是世界上唯一国土覆盖一整个大陆的国家&#xff0c;其领土面积是全球第六大&#xff0c;有着优越的的经济条件、环境优美&#xff0c;农牧业发达&#xff0c;商机无处不在。并且&#xff0c;经济法律体制健全&#xff0c;在公…

Mybatis Plus二级缓存 使用@CacheNamespace 失效@CacheNamespace和@CacheNamespaceRef

1、注解 CacheNamespace(flushInterval 100000,eviction LruCache.class,readWrite false,size 1024)2、xml配置 <cache eviction "LRU" flushInterval "100000" readOnly "true" size "1024"/> 二级缓存&#xff0c;配置文…

【Linux 性能详解】CPU性能分析工具篇

目录 uptime mpstat 实时监控 查看特定CPU核心 pidstart 监控指定进程 组合多个监控类型 监控线程资源 按用户过滤进程 vmstart 用途 基本用法 输出字段 perf execsnoop dstat 通俗解释 技术层面解释 使用示例 总结 uptime uptime 是一个在 Linux 和 Unix…