动态规划-子数组1

文章目录

  • 1. 最大子数组和(53)
  • 2. 环形子数组的最大和(918)
  • 3. 乘积最大子数组(152)
  • 4. 乘积为正数的最长子数组长度(1567)


1. 最大子数组和(53)

题目描述:
在这里插入图片描述
状态表示:
根据经验以及题目要求设置数组dp[i]表示以i位置为结尾的最大子数组和。
状态转移方程:
第i个数组元素可以单独构成子数组也可以和前面的i-1或者和i-1、i-2构成子数组,第i个元素单独构成子数组为dp[i]=num[i],第i个元素和前面元素构成子数组,即dp[i]=dp[i-1]+nums[i],所以最终的dp[i]=max(dp[i-1]+nums[i],nums[i])。
初始化:
为了避免数组越界,初始化dp[0]=nums[0]。
填表顺序:
从左至右。
返回值:
返回dp数组中的最大值。
代码如下:

class Solution {
    public int maxSubArray(int[] nums) {
        int n = nums.length;

        int[] dp = new int[n];
        dp[0] = nums[0];

        int max = dp[0];
        for (int i = 1; i < n; i++) {
            dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
            max = Math.max(max, dp[i]);
        }

        return max;
    }
}

题目链接
时间复杂度:O(n)
空间复杂度:O(n)

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

题目描述:
**在这里插入图片描述
状态表示:
这题的状态表示方法和上一题是类似的,但是做法与上一题不同,因为这里涉及到环形数组的最大子数组和相当于数组的前后是相连的。环形数组的最大子数组和有两种情况,如下图。所以这里需要将两种情况的最大值都求出来然后返回两者中的最大值,第一种情况很简单就是上一题的求法定义f[i]表示以i位置为结尾的最大子数组和。第二种情况可以先求出在第一种情况的最小子数组和,然后将总的数组和减去最小数组和即可得到,g[i]表示以i位置为结尾的最小子数组和。
在这里插入图片描述

状态转移方程:
f[i]=max(f[i-1]+nums[i],nums[i])和g[i]=max(g[i-1]+nums[i],nums[i])。

初始化:
nums数组长度为n,为了方便初始化可以将f和g的长度设为n+1,然后初始化f[0]和g[0]的值。这里的初始化的值不能够影响最终输出的结果。如果f和g数组按正常步骤设为长度为n的数组,那么f[0]和g[0]应该都等于nums[0]。如果f和g设为n+1长度的数组,f[0]和g[0]变为f[1]和g[1],为了使f[0]和g[0]不影响f[1]和g[1]的nums[0]的值,根据状态转移方程,f[0]和g[0]应该赋为0。还要一个细节当f和g都设为n+1长度后要注意和nums数组的映射关系。
填表顺序:
从左至右。
返回值:
返回f数组的最大值和总数组和减去g数组最小值之间的最大值,这里注意一个细节当数组全为负数时,总数组和减去g数组最小值为0那么代码就会返回0,但是数组中全是负数。因此当发生这种情况时就直接返回f数组的最大值。
代码如下:

class Solution {
    public int maxSubarraySumCircular(int[] nums) {
        int n = nums.length;

        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += nums[i];
        }

        int[] f = new int[n + 1];
        int[] g = new int[n + 1];

        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for (int i = 1; i <= n; i++) {
            f[i] = Math.max(f[i - 1] + nums[i - 1], nums[i - 1]);
            g[i] = Math.min(g[i - 1] + nums[i - 1], nums[i - 1]);
            max = Math.max(max, f[i]);
            min = Math.min(min, g[i]);
        }

        return sum == min ? max : Math.max(max, sum - min);

    }

}

题目链接
时间复杂度:O(n)
空间复杂度:O(n)

3. 乘积最大子数组(152)

题目描述:
在这里插入图片描述
状态表示:
设置两个数组分别为f[i]和g[i]分别代表以i位置为结尾的子数组最大乘积和最小乘积。
状态转移方程:
当nums[i]大于0时,f[i]=max(f[i-1]*nums[i],nums[i]),g[i]=min(g[i-1]*nums[i],nums[i])。当nums[i]小于0时,f[i]=max
(g[i-1]*nums[i],nums[i]),g[i]=min(f[i-1]*nums[i],nums[i])。
初始化:
初始化为了避免越界以及方便运算,将f和g的长度设为n+1,f[0]和g[0]都初始化为1,这样不会影响最终的输出结果,还有一个细节就是要注意nums数组的下标映射。
填表顺序:
从左至右。
返回值:
f数组中的最大值。
代码如下:

class Solution {
    public int maxProduct(int[] nums) {
        int n = nums.length;

        int[] f = new int[n + 1];
        int[] g = new int[n + 1];

        f[0] = 1;
        g[0] = 1;

        int max = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            if (nums[i - 1] < 0) {
                f[i] = Math.max(g[i - 1] * nums[i - 1], nums[i - 1]);
                g[i] = Math.min(nums[i - 1], f[i - 1] * nums[i - 1]);
            } else {
                f[i] = Math.max(f[i - 1] * nums[i - 1], nums[i - 1]);
                g[i] = Math.min(nums[i - 1], g[i - 1] * nums[i - 1]);
            }

            max = Math.max(max, f[i]);
        }

        return max;
    }
}

题目链接
时间复杂度:O(n)
空间复杂度:O(n)

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

题目描述:
在这里插入图片描述
状态表示:
建立两个数组,f[i]表示以i位置为结尾的乘积为正数的最长子数组长度,g[i]表示以i位置为结尾的乘积为负数的最长子数组长度。
状态转移方程:
当nums[i]大于0时,f[i]=f[i-1]+1,g[i]=g[i-1]+1,但是其实g[i]这里的表示是有问题的,当g[i-1]等于0时逻辑上g[i]应该等于0,但是如果按照这个状态转移方程g[i]却等于1,所以需要修改为g[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1。当nums[i]小于0时,f[i-1]=g[i-1]+1,这里也是一样当g[i-1]等于0是f[i]应该等于0而不是1,应该修改为当g[i-1]等于0时f[i]=0否则f[i]=g[i-1]+1 ,g[i]=f[i-1]+1。
初始化:
将f和g数组初始化为长度为n+1的数组,为了不影响最终的输出结果,根据状态转移方程,将g[0]和f[0]都赋为0。
填表顺序:
从左至右。
返回值:
f数组的最大值。
代码如下:

class Solution {
    public int getMaxLen(int[] nums) {
        int n = nums.length;

        int[] f = new int[n + 1];
        int[] g = new int[n + 1];

        int max = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            if (nums[i - 1] < 0) {
                f[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;
                g[i] = f[i - 1] + 1;
            } else if (nums[i - 1] > 0) {
                f[i] = f[i - 1] + 1;
                g[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;
            }
            max = Math.max(max, f[i]);
        }

        return max;
    }
}

题目链接
时间复杂度:
空间复杂度:

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

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

相关文章

Linux yum搭建Keepalived,2 台机器都有虚拟 IP 问题

文章目录 Keepalived 搭建一、安装二、keepalived配置1、配置文件详解global_defs模块参数vrrp_instance模块参数vrrp_script模块参数 2、修改配置文件3、启动服务 Tips:1️⃣问题&#xff1a;两台机器上面都有VIP的情况2️⃣完整配置文件 Keepalived 搭建 服务IP服务器Keepal…

[数据结构]——二叉树——堆的实现

1. 堆的概念及结构 如果有一个关键码的集合K { &#xff0c; &#xff0c; &#xff0c;…&#xff0c; }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满足&#xff1a; < 且 < ( > 且 > ) i 0&#xff0c;1&…

【力扣TOP100热题图解】T1.两数之和

题目链接点这里—— 力扣&#xff08;LeetCode&#xff09;​​​​​​ 法一&#xff1a;暴力枚举 最容易想到的方法是枚举数组中的每一个数 x&#xff0c;寻找数组中是否存在 target - x。 当我们使用遍历整个数组的方式寻找 target - x 时&#xff0c;需要注意到每一个位…

ViT——nlp和cv进行了统一,使多模态成为可能

题目:AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 1.概述之前的transformer在cv中应用,大部分是将CNN模型中部分替换成transformer block(整体网络结构不变)或者用transformer将不同网络连接起来,而本文提出:一个针对图像patch的纯的t…

雷达智能名片小程序源码系统 带完整的安装代码包以及搭建教程

在数字化高速发展的今天&#xff0c;名片作为商务交流中的一张“金名片”&#xff0c;其形式与功能也在不断地迭代升级。雷达智能名片小程序源码系统应运而生&#xff0c;为企业和个人提供了一个全新的、智能化的名片展示与互动平台。本文将对雷达智能名片小程序源码系统的开发…

二叉树的前、中、后序遍历【c++】

前序遍历&#xff1a;根左右 中序遍历&#xff1a;左根右 后序遍历&#xff1a;左右根 #include <iostream> #include <vector> using namespace std;//双链表节点结构 typedef struct treeNode {int value;struct treeNode* left;struct treeNode* right;treeNod…

【python】在pycharm用Django写一个API接口

背景 Django是一个高级的Python Web框架&#xff0c;它鼓励快速开发和干净、实用的设计。它由经验丰富的开发者设计&#xff0c;解决了Web开发的大部分麻烦&#xff0c;因此开发者可以专注于编写应用而不是重复造轮子。Django遵循MVC设计模式&#xff0c;并拥有自带的一套便捷…

Testng测试框架(2)-测试用例@Test

测试方法用 Test 进行注释&#xff0c;将类或方法标记为测试的一部分。 Test() public void aFastTest() {System.out.println("Fast test"); }import org.testng.annotations.Test;public class TestExample {Test(description "测试用例1")public void…

【Unity 实用工具篇】 | UIEffect 实现一系列UGUI特效,灰度、负片、像素化特效

前言 【Unity 实用工具篇】 | UIEffect 实现一系列UGUI特效&#xff0c;灰度、负片、像素化特效一、UGUI特效插件&#xff1a;UIEffect1.1 介绍1.2 效果展示1.3 使用说明及下载 二、组件属性面板三、代码操作组件四、组件常用方法示例4.1 使用灰度特效做头像(关卡)选择 总结 前…

C语言实现三子棋游戏(可以改变为四子棋或者多子棋版)

游戏介绍 三子棋游戏或者说是井字棋游戏&#xff0c;相信大家都玩过&#xff0c;一般的流程就是在一个棋盘上&#xff0c;玩家下棋之后&#xff0c;电脑下棋&#xff0c;然后判断输赢&#xff0c;如果没输没赢&#xff0c;就再玩家下棋&#xff0c;电脑下棋。 游戏框架 对于…

AI大模型探索之路-应用篇13:企业AI大模型选型指南

目录 前言 一、概述 二、有哪些主流模型&#xff1f; 三、模型参数怎么选&#xff1f; 四、参数有什么作用&#xff1f; 五、CPU和GPU怎么选&#xff1f; 六、GPU和显卡有什么关系&#xff1f; 七、GPU主流厂商有哪些&#xff1f; 1、NVIDIA芯片怎么选&#xff1f; 2、…

Web前端 Javascript笔记1

为什么学习 JavaScript? JavaScript 是 web 开发人员必须学习的 3 门语言中的一门&#xff1a; HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 JavaScript 是可插入 HTML 页面的编程代码。 JavaScript 插入 HTML 页面后&#xff0c;可由所有的现代浏…

FPGA原理与结构(8)——块RAM(Block RAM,BRAM)

系列文章目录&#xff1a;FPGA原理与结构&#xff08;0&#xff09;——目录与传送门 一、BRAM简介 大家对于RAM应该并不陌生&#xff0c;RAM就是一张可读可写的存储表&#xff0c;它经常被拿来与ROM进行对比&#xff0c;相比之下&#xff0c;ROM只可读。而在FPGA中&#xff0c…

图灵奖2023:Avi Wigderson的开创性贡献揭示计算中的随机性和伪随机性

文章目录 每日一句正能量前言背景什么是理论计算机科学&#xff1f;为什么随机性很重要&#xff1f;三篇影响深远的论文Avi Wigderson在计算复杂性理论方面的贡献及其对现代计算的影响Avi Wigderson对随机性和伪随机性在计算中作用的理解及其实际应用Avi Wigderson的学术生涯和…

用于密集视觉冲击的紧凑三维高斯散射Compact 3D Gaussian Splatting For Dense Visual SLAM

Compact 3D Gaussian Splatting For Dense Visual SLAM 用于密集视觉冲击的紧凑三维高斯散射 Tianchen Deng 邓天辰11Yaohui Chen 陈耀辉11Leyan Zhang 张乐妍11Jianfei Yang 杨健飞22Shenghai Yuan 圣海元22Danwei Wang 王丹伟22Weidong Chen 陈卫东11 Abstract 摘要 …

008、Python+fastapi,第一个后台管理项目走向第8步:ubutun 20.04下安装vscode+python环境配置

一、说明 白飘了3个月无影云电脑&#xff0c;开始选了个windows server 非常不好用&#xff0c;后台改为ubuntu想升级到22&#xff0c;没成功&#xff0c;那就20.04吧。 今天先安装下开发环境&#xff0c;后续2个月就想把他当做开发服务器&#xff0c;不知道行不行&#xff0c;…

行式存储VS列式存储对比

行式存储&#xff1a; 一行代表一个记录的所有字段。 可以快速读取和写入单条记录。 如果要检索一条数据&#xff0c;数据库会读取or写入整条记录&#xff0c;包含所有相关字段。 列式存储&#xff1a; 表中每一列的数据连续存放。这种方式在需要对某一列进行大量运算或分析时…

PSAvatar:一种基于点的可变形形状模型,用于3D高斯溅射的实时头部化身创建

PSAvatar: A Point-based Morphable Shape Model for Real-Time Head Avatar Creation with 3D Gaussian Splatting PSAvatar&#xff1a;一种基于点的可变形形状模型&#xff0c;用于3D高斯溅射的实时头部化身创建 Zhongyuan Zhao1,2, Zhenyu Bao1,2, Qing Li1, Guoping Qiu3,…

计算机虚拟机服务器中了mallox勒索病毒怎么办Mallox勒索病毒解密流程工具

在当今社会&#xff0c;人们的工作生活离不开网络&#xff0c;尤其企业离不开网络办公&#xff0c;网络为企业提供了极大便利&#xff0c;大大提升了企业的生产效率与办公水平&#xff0c;但网络是一把双刃剑&#xff0c;在为企业提供便利的同时也为企业的数据带来严重威胁。近…

【攻防世界】warmup

[HCTF 2018]WarmUp全网最详细解释_[hctf 2018]warmup的解-CSDN博客 php://filter 读取源码&#xff08;文件&#xff09; php://input 执行php代码&#xff0c;需要post请求提交数据 Content-Type为image/jpeg text. 绕过后缀的有文件格式有php,php3,php4,php5,pht…