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

news2024/11/17 10:00:06

一、最大子数组和

最大子数组和

算法原理: 

 💡细节:

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.coloradmin.cn/o/1656121.html

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

相关文章

vue+lodop实现web端打印标签功能

背景&#xff1a;项目要求在web端连接标签打印机&#xff0c;打印收件人信息 lodop打印插件地址&#xff1a;Lodop和C-Lodop官网主站 在项目中使用 1、去官网下载lodop包下载中心 - Lodop和C-Lodop官网主站 windows系统直接下载windows32版的就可以 2、解压安装 点击CLodop…

gtest的编译与使用

文章目录 gtest的编译与使用概述笔记CMake参数官方文档测试程序测试效果END gtest的编译与使用 概述 gTest是 googletest的缩写&#xff0c;如果直接找gTest项目&#xff0c;是找不到的。 库地址 https://github.com/google/googletest.git 迁出到本地后&#xff0c;切到最新…

vue中使用element的i18n语言转换(保姆式教程-保证能用)

1、项目中需要使用的插件&#xff0c;vue2或vue3、element、vue-i18n、js-cookie、vuex我是在vue2中使用 npm i element-ui -S npm i js-cookie -S npm i vue-i18n8.28.2 //因为我项目使用的vue2&#xff0c;直接安装报错了,就下载了固定的版本2、在main.js中引入i18n impor…

买手机参考

买手机一定要看cpu排行榜&#xff0c;避免受外界宣传或干扰等因素等的影响&#xff0c;导致买家消费者被割韭菜。是高等手机还是低等手机&#xff0c;cpu排行榜就是照妖镜。cpu综合处理能力&#xff08;兼顾功耗&#xff09;排行榜如图。 第二张 第三张 第四张

C#语言核心

一、面向对象基本概念 万物皆对象&#xff0c;用程序来抽象&#xff08;形容&#xff09;对象&#xff0c;用面向对象的思想来编程 用中文去形容一类对象&#xff0c;把一类对象的共同点提取出来&#xff0c;然后用程序语言把它翻译过来&#xff0c;带着对象的概念在程序中使…

Excel 查找值的位置后再用位置取值Excel处理

例题描述 Excel 文件中有下图所示的 3 个片区数据 (不同颜色标明)。 现在要算出1-12对应的一列数据&#xff0c;计算规则&#xff1a;在片区3中依次查找1-12&#xff0c;找到后在片区1对应位置取数&#xff0c;如果是0则取片区2同位置的数&#xff0c;如果是1则取F当前查找数。…

docker-compose管理jenkins

1.安装docker和compose 1.docker 更新系统&#xff1a;yum update 安装依赖项&#xff1a;yum install -y yum-utils device-mapper-persistent-data lvm2 配置镜像源&#xff1a;yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce…

出货300万片后,智舱界「小高通」浮出水面

‍作者 |张祥威 编辑 |德新 2024年北京车展&#xff0c;本土芯片公司开始截击外企供应商。 很长一段时间内&#xff0c;汽车行业智驾芯片看英伟达&#xff0c;座舱芯片看高通。英伟达Orin系列广受欢迎&#xff0c;高通8155席卷主流智能汽车&#xff0c;8295更是被视为最强配置…

Seata之AT 模式的使用

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Seata 是一款开源的…

STM32F4xx开发学习_USART串口通讯

USART串口通讯 USART简介 USART&#xff08;universal synchronous asynchronous receiver transmitter&#xff09;&#xff0c;通用同步异步接收发射机&#xff0c;是一种全双工异步通信串行通讯方式&#xff0c;是STM32内部集成的硬件外设&#xff0c;以帧格式传输数据。搭…

NAT网络基本原理和认识,内网穿透的必备知识

NAT的基本介绍 NAT&#xff08;Network Address Translation&#xff09;是网络地址转换&#xff0c;它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准&#xff0c;允许一个整体机构以一个公用IP&#xff08;Internet Protocol&#xff09;地址出现在I…

二总线,替代传统485总线通讯,主站设计

二总线通信设计专栏 《二总线&#xff0c;替代传统485总线通讯&#xff0c;选型及应用-CSDN博客》《二总线&#xff0c;替代传统485总线通讯&#xff0c;低成本直流载波方案实现及原理-CSDN博客》《二总线&#xff0c;替代传统485总线通讯&#xff0c;调试避坑指南之最大的电流…

探索鸿蒙开发:鸿蒙系统如何引领嵌入式技术革新

嵌入式技术已经成为现代社会不可或缺的一部分。而在这个领域&#xff0c;华为凭借其自主研发的鸿蒙操作系统&#xff0c;正悄然引领着一场技术革新的浪潮。本文将探讨鸿蒙开发的特点、优势以及其对嵌入式技术发展的深远影响。 鸿蒙操作系统的特点 鸿蒙&#xff0c;作为华为推…

【Java】从0实现一个基于SpringBoot的个人博客系统

从0实现一个基于SpringBoot的个人博客系统 项目介绍准备工作数据准备创建项目准备前端页面编写配置文件 项目公共模块实体类公共层业务代码持久层实现博客列表实现博客列表约定前后端交互接口 实现博客详情约定前后端交互接口实现服务器代码 实现登录JWT令牌JWT令牌生成和校验实…

详解如何把文件或应用开机自启动

相信很多人都想把某些开机都要用的软件或文件打开&#xff0c;但不知道如何操作&#xff0c;或不知道可以手动设置开机自启动这一操作&#xff0c;下面为大家讲解实现思路&#xff1a; 1.首先打开winR打开运行框&#xff0c;在里面弄输入&#xff1a;shell:startup 2.回车进入文…

Win10/11共享文件夹,访问提示需要输入用户名密码

Win10/11共享文件夹&#xff0c;访问提示需要输入用户名密码 问题 已经关闭了密码保护共享&#xff0c;但是局域网其他电脑访问该文件夹&#xff0c;提示需要输入用户名和密码 解决方法 操作步骤 1.按WINR键打开运行&#xff0c;输入gpedit.msc打开本地组策略编辑器 2.按如…

Hive SQL-DML-Load加载数据

Hive SQL-DML-Load加载数据 在 Hive 中&#xff0c;可以使用 SQL DML&#xff08;Data Manipulation Language&#xff09;语句中的 LOAD 命令来加载数据到表中。LOAD 命令用于将本地文件系统或 HDFS&#xff08;Hadoop 分布式文件系统&#xff09;中的数据加载到 Hive 表中。 …

CSAPP | Floating Point

CSAPP | Floating Point b i b_i bi​ b i − 1 b_{i-1} bi−1​ … b 2 b_2 b2​ b 1 b_1 b1​ b 0 b_0 b0​ b − 1 b_{-1} b−1​ b − 2 b_{-2} b−2​ b − 3 b_{-3} b−3​ … b − j b_{-j} b−j​ S ∑ k − j i b k 2 k S\sum_{k-j}^{i}b_k\times2^k S∑k…

目标检测算法YOLOv6简介

YOLOv6由Chuyi Li等人于2022年提出&#xff0c;论文名为&#xff1a;《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/2209.02976 &#xff0c;项目网页&#xff1a;https://github.c…

67万英语单词学习词典ACCESS\EXCEL数据库

这似乎是最多记录的英语单词学习词典&#xff0c;包含复数、过去分词等形式的单词。是一个针对想考级的人员辅助背单词学英语必备的数据&#xff0c;具体请自行查阅以下的相关截图。 有了数据才能想方设法做好产品&#xff0c;结合权威的记忆理论&#xff0c;充分调动用户的眼…