LeetCode-152. 乘积最大子数组

news/2024/9/23 0:26:24/

目录

    • 思路
    • 动态规划

题目来源
152. 乘积最大子数组

思路

这题跟LeetCode-53. 最大子数组和很像
最后把整个 dp 数组看一遍求最大值即可。因此状态转移方程可能是:

dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);

说明:牢记状态的定义,一定以下标 i 结尾,即:乘积数组中 nums[i] 必须被选取。

如果 dp[i - 1] 是负数,乘上 nums[i] 还是负数。
如果 nums[i] 是负数该怎么办呢?dp[i - 1] 是正数的时候,越乘越小,dp[i - 1] 是负数的时候,越乘越大,于是我们可能就需要记录一下负数的那个最小数。
遇到这样的问题,其实就在提示我们状态不够用了。因此,需要在原来的一维 dp 后面新增一个状态。
针对这道题,第 2 维状态只需要两个:

  • dp[i][1] 表示:以 nums[i] 结尾的连续子序列的乘积的最大值;
    用 1 表示遍历的过程中得到的以 nums[i] 结尾的连续子序列的乘积的最大值。
  • dp[i][0] 表示:以 nums[i] 结尾的连续子序列的乘积的最小值。
    用 0 表示遍历的过程中得到的以 nums[i] 结尾的连续子序列的乘积的最小值;

动态规划

  • 1.确定dp数组以及下标的含义

dp[i][2]:包括下标i(以nums[i]为结尾)的乘积最大子数组积为dp[i]。

  • 2.确定递推公式

我们要收集自己本身,之前的最大值×当前数,之前的最小值×当前数

dp[i][1] = Math.max(nums[i],Math.max(dp[i-1][1]*nums[i],dp[i-1][0]*nums[i]));
dp[i][0] = Math.min(nums[i],Math.min(dp[i-1][1]*nums[i],dp[i-1][0]*nums[i]));
  • 3.dp数组如何初始化

根据递推公式可知,可以推出我们要初始化dp[0][0]和dp[0][1]为当前数nums[0]
dp[0][0] = nums[0];
dp[0][1] = nums[0];

  • 4.确定遍历顺序

根据递推公式可知,从左到右遍历

  • 5.举例推导dp数组

在这里插入图片描述

代码实现

class Solution {public int maxProduct(int[] nums) {int[][] dp = new int[nums.length][2];dp[0][0] = nums[0];dp[0][1] = nums[0];int res = nums[0];for(int i = 1;i<nums.length;i++){dp[i][1] = Math.max(nums[i],Math.max(dp[i-1][1]*nums[i],dp[i-1][0]*nums[i]));dp[i][0] = Math.min(nums[i],Math.min(dp[i-1][1]*nums[i],dp[i-1][0]*nums[i]));res = Math.max(res,dp[i][1]);}return res;}
}

在这里插入图片描述


http://www.ppmy.cn/news/43048.html

相关文章

NDK RTMP直播客户端二

在之前完成的实战项目【FFmpeg音视频播放器】属于拉流范畴&#xff0c;接下来将完成推流工作&#xff0c;通过RTMP实现推流&#xff0c;即直播客户端。简单的说&#xff0c;就是将手机采集的音频数据和视频数据&#xff0c;推到服务器端。 接下来的RTMP直播客户端系列&#xff…

在 Flutter 多人视频通话中实现虚拟背景、美颜与空间音效

前言 在之前的「基于声网 Flutter SDK 实现多人视频通话」里&#xff0c;我们通过 Flutter 声网 SDK 完美实现了跨平台和多人视频通话的效果&#xff0c;那么本篇我们将在之前例子的基础上进阶介绍一些常用的特效功能&#xff0c;包括虚拟背景、色彩增强、空间音频、基础变声…

机器学习-作业2-贝叶斯网络

作业2 实现能处理连续属性的贝叶斯网络。 思路 怎么自动判断该属性是离散还是连续&#xff1a;计算该属性的不同值有多少个&#xff0c;超过10个就认为是连续&#xff0c;否则是离散的。离散的&#xff1a;统计该类、该属性、该值的各个数量&#xff0c;计算概率&#xff0c…

react-router原理

前端路由的原理 自己来监听URL的改变&#xff0c;改变url&#xff0c;渲染不同的组件(页面)&#xff0c;但是页面不要进行强制刷新&#xff08;a元素不行&#xff09;。 hash模式&#xff0c;localhost:3000/#/abc 优势就是兼容性更好&#xff0c;在老版IE中都可以运行缺点是…

【hello Linux】Linux软件管理器yum

目录 1.Linux软件管理器yum 1.1 关于lrzsz 1.2 使用yum时的注意事项 1.3 查看软件包&#xff1a;yum list 1.4 安装软件&#xff1a;yum install 1.5 卸载软件&#xff1a;yum remove 1.6 更新yum源 1.7 实战项目 Linux&#x1f337; 1.Linux软件管理器yum 在windows系统下有应…

技术创业者必读:从验证想法到技术产品商业化的全方位解析

导语 | 技术创业之路往往充满着挑战和不确定性&#xff0c;对于初入创业领域的人来说&#xff0c;如何验证自己的创业想法是否有空间、如何选择靠谱的投资人、如何将技术产品商业化等问题都需要认真思考和解决。在「TVP 技术夜未眠」第六期直播中&#xff0c;正马软件 CTO、腾讯…

ChatGPT风口下的中外“狂飙”,一文看懂微软、谷歌、百度、腾讯、华为、字节跳动们在做什么?

毫无疑问&#xff0c;ChatGPT正成为搅动市场情绪的buzzword。 历史经历过无线电&#xff0c;半导体&#xff0c;计算机&#xff0c;移动通讯&#xff0c;互联网&#xff0c;移动互联网&#xff0c;社交媒体&#xff0c;云计算等多个时代&#xff0c;产业界也一直在寻找Next Bi…

Java开发 - MySQL主从复制初体验

前言 前面已经学到了很多知识&#xff0c;大部分也都是偏向于应用方面&#xff0c;在应用实战这条路上&#xff0c;博主一直觉得只有实战才是学习中最快的方式。今天带来主从复制给大家&#xff0c;在刚刚开始动手写的时候&#xff0c;才想到似乎忽略了一些重要的东西&#xf…