【动态规划】子数组、子串系列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.mfbz.cn/a/606394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apifox 教程:如何实现跨语言调用(Java、PHP、Python、Go 等)

在一些特定场景下&#xff0c;比如需要在 Apifox 中对文件进行读写、加密、转换格式或者进行其它业务的操作时&#xff0c;仅使用 Apifox 内置的 JS 类库可能无法满足业务需求&#xff0c;这时&#xff0c;就可以借助「外部程序」作为解决方案。 外部程序是保存在「外部程序目…

Tower for Mac:Git管理的新境界

Tower for Mac&#xff0c;让您的Git管理进入新境界&#xff01;这款专为Mac用户打造的Git客户端&#xff0c;凭借其出色的性能和丰富的功能&#xff0c;成为众多开发者的首选工具。 Tower不仅支持常规的Git操作&#xff0c;如提交、推送和拉取&#xff0c;还提供了许多高级功能…

AR人脸美妆SDK解决方案,让妆容更加贴合个人风格

美妆行业正迎来前所未有的变革&#xff0c;为满足企业对高效、精准、创新的美妆技术需求&#xff0c;美摄科技倾力打造了一款企业级AR人脸美妆SDK解决方案&#xff0c;为企业打开美妆领域的新世界大门。 革命性的人脸美妆技术 美摄科技的AR人脸美妆SDK解决方案&#xff0c;不…

攻略:ChatGPT3.5~4.0(中文版)国内无限制免费版(附网址)【2024年5月最新更新】

一、什么是ChatGPT&#xff1f; 1、ChatGPT的全名是Chat Generative Pre-trained Transformer&#xff0c;其中"chat"表示聊天。"GPT"则是由三部分组成&#xff1a;生成式&#xff08;generative&#xff09;意味着具有创造力&#xff1b;预训练&#xff0…

计算机毕业设计 | vue+springboot图书借阅 书籍管理系统(附源码)

1. 开发目的 实现图书的智能化、信息化和简单化&#xff1b;实现图书信息的增加、删除、修改、查找、借阅、还书、收藏的显示操作及实时数据库的提交和更改和对普通用户的增、删、改、查&#xff1b;提高图书管理员工作信息报送及反馈的工作效率&#xff0c;减轻管理员的劳动负…

基于Spring Boot框架实现大学生选课管理系统

文章目录 源代码下载地址项目介绍项目功能界面预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 教务处管理 开课、开班审批&#xff0c;排课处理&#xff0c;班级操作&#xff0c;选课时间段管理** 使用了sql解决了开课开班的时间段的冲突…

Python的Web框架Flask+Vue生成漂亮的词云图

生成效果图 输入待生成词云图的文本&#xff0c;点击生成词云即可&#xff0c;在词云图生成之后&#xff0c;可以点击下载图片保存词云图。 运行步骤 分别用前端和后端编译器&#xff0c;打开backend和frontend文件夹。前端运行 npm install &#xff0c;安装相应的包。后端…

再也不用担心 AI 图片脸崩手崩了

如果你经常用 Stable Diffusion 画人物&#xff0c;相信你一定画出过脸崩的图片。这也是目前文生图 AI 工具普遍存在的问题。连 Midjourney V6 也不例外&#xff01;当它画一个人的时候表现还好&#xff0c;当画面里的人一多&#xff0c;局面就难以控制了。 看&#xff0c;这就…

远动通讯屏的作用

远动通讯屏的作用 远动通讯屏有时有称为调度数据网柜&#xff0c;远动通讯屏具体干啥作用&#xff1f;远动通讯屏是以计算机为基础的生产过程与调度自动化系统&#xff0c;可以对现场的运行设备进行监视和控制、以实现数据采集、设备测量、参数调节以及各类信号报警等各项功能。…

segment anythin 新标注工具 paddleocr训练自己的数据

快递单ocr检测 1.总结2.需求3.方案4.面单定位4.1反转图片扩充数据集4.2新的标注方式4.3json2yolo4.4yolov5推理 5.paddleocr5.1 数据标注5.2 文本检测训练5.3 文本识别训练检测结果 1.总结 按照惯例&#xff0c;先吐槽一下。反正也没人看我比比歪歪。做事全部藏着掖着&#xf…

致力于双碳减排服务——安科瑞推出碳电表

1. 概述 全球首个“碳关税”——欧盟碳边境调节机制于2023年10月启动试运行。自此&#xff0c;首批纳入欧盟碳边境调节机制的6个行业相关产品在出口至欧盟国家时需提供碳排放数据&#xff0c;这会倒逼国内制造业企业加快开展产品碳足迹核查的步伐。以钢铁行业为例&#xff0c;…

怎样把excel表格转换成图片格式?学会这3个Excel小技巧,表格操作不求人,工作效率翻倍

一&#xff0c;前言 excel是办公必备的表格处理软件&#xff0c;每个表格都包含大量的数据和函数逻辑关系&#xff0c;牵一发而动全身。传输excel表格时可以将文件转换成图片或者pdf&#xff0c;这样有利于传输&#xff0c;而且不会改变表格原有的格式。那么怎样才能把excel转…

“告别传统编码:Baidu Comate智能助手引领软件生产力革命”

文章目录 写在前面&#xff1a;Baidu Comate智能编码助手核心功能助力全方位的软件开发支持一、自动化代码生成二、智能代码审查三、实时智能生成完整代码块四、注释生成代码五、对话式生成代码六、生成单元测试七、生成注释八、代码优化九、代码解释十、技术问答 快速上手体验…

家装空间3D建模素材:打造理想家园的必备工具

在家装过程中&#xff0c;设计师和业主往往需要通过3D建模技术来实现对空间的精确规划和设计。3D建模素材作为这一领域的基础元素&#xff0c;为设计师提供了丰富的想象空间&#xff0c;帮助他们更好地呈现业主的期望和需求。 这些3D建模素材可以涵盖各种家装元素&#xff0c;如…

算法day02

1、202. 快乐数 如上题所述&#xff1a; 在该题意规则下&#xff0c;所有的数字变化会有两种情况&#xff0c;其一最后是有的会变化成恒为1的数&#xff1b;其二是有的数会变化会呈现成有规律的环&#xff0c;分别如下图所示&#xff1a; 可以近似的理解为图一就是一个环&#…

VMware虚拟机问题解决方案

1、运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2、卸载VMware的步骤 1&#xff09;卸载已经安装的VMware 从控制面…

Vuex 和 Pinia 两个状态管理模式的区别

Pinia和Vuex一样都是是vue的全局状态管理器。其实Pinia就是Vuex5&#xff0c;只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia。&#xff08;实际项目中千万不要即用Vuex又用Pinia&#xff0c;不然你会被同事‘’请去喝茶的‘’。 一、安装&#xff08;常用命令安…

(二十一)springboot实战——Spring AI劲爆来袭

前言 本节内容是关于Spring生态新发布的Spring AI的介绍&#xff0c;Spring AI 是一个面向人工智能工程的应用框架。其目标是将 Spring 生态系统的设计原则&#xff0c;如可移植性和模块化设计&#xff0c;应用到人工智能领域&#xff0c;并推广使用普通的Java对象&#xff08…

ES6语法教程

简介&#xff1a; ECMA European Computer Manufactures Association 欧洲计算机制造商协会&#xff0c;该组织的目标是评估、开发、和认可电信和计算机标准&#xff0c;94年后该组织改名为Ecma国标。 ECMAScript是由Ecma国际通过ECMA-262标准化的脚本程序设计语言 Ecma国…

将Flutter程序打包为ios应用并进行安装使用

如果直接执行flutter build ios: Building com.example.myTimeApp for device (ios-release)...════════════════════════════════════════════════════════════════════════════════No vali…
最新文章